设计模式之结构型模型

桥接模式
尽可能不要使用类的继承,而尽可能使用 合成/聚合
描述: 继承方法子类与父类的高依赖性限制了复用和程序的灵活性。

选择不同的接口实现选择不同的业务类型

import org.junit.Test;
public class 桥接模式 {@Testpublic void test(){ColocalateFactory a=new BlackFactory();a.ColocalateMarking();ColocalateFactory b=new WhilteFactory();b.ColocalateMarking();}}
interface ColocalateFactory
{void ColocalateMarking();
}
class BlackFactory implements ColocalateFactory
{@Overridepublic void ColocalateMarking() {// TODO Auto-generated method stubSystem.out.println("生产黑色巧克力");}}
class WhilteFactory implements ColocalateFactory
{@Overridepublic void ColocalateMarking() {// TODO Auto-generated method stubSystem.out.println("生产白色巧克力");}}

适配器模式
描述:维护人员处理功能相同或者相似,但方法不同。进行接口的统一调用。

  • 注入需要适配的类的时候,使用set方法而不是new实例化对象,从而防止固化。

  • 适配类的方法与要被适配类的方法不是平行关系而是调用关系。

public interface Charger {void GetPower();
}
//充电器A
public class ChargerA implements Charger {@Overridepublic void GetPower() {// TODO Auto-generated method stubSystem.out.println("使用220V经行充电");}
}
//充电器B
public class ChargerB implements Charger {@Overridepublic void GetPower() {// TODO Auto-generated method stubSystem.out.println("使用200V进行充电");}
}//万能充电器
import org.junit.Test;
public class MultCharger implements Charger {private Charger charger;public void setCharger(Charger charger) {this.charger = charger;}@Overridepublic void GetPower() {// TODO Auto-generated method stubthis.charger.GetPower();}@Testpublic void test(){Charger a=new ChargerA();Charger b=new ChargerB();MultCharger Multcharger=new MultCharger();Multcharger.setCharger(a);Multcharger.GetPower();Multcharger.setCharger(b);Multcharger.GetPower();}
}

装饰器模式
描述:在不改变原有类文件和使用继承的情况下,动态扩展某个对象的功能。(这样决定了不能直接添加类方法)

  • 适配器模式 适配对象和被适配器对象可以不存在实现统一接口的关系(即兄弟类)。 目的是:兼容
  • 装饰器模式:是继承的一种替代方法,相对而言更加灵活。目的是:增强
import org.junit.Test;
public class 装饰器模式 {@Testpublic void test(){Soldier s=new SmallSoldier();BigSoldier b=new BigSoldier();b.setSoldier(s);b.fighting();}}
interface Soldier
{void fighting();
}
class SmallSoldier implements Soldier
{@Overridepublic void fighting() {// TODO Auto-generated method stubSystem.out.println("普通士兵在战斗");}}
class BigSoldier implements Soldier
{private Soldier soldier;public void setSoldier(Soldier soldier) {this.soldier = soldier;}@Overridepublic void fighting() {// TODO Auto-generated method stubsoldier.fighting();System.out.println("配置了远程兵在辅助");}}

组合模式
利用递归的思想
描述:将对象组合成树形结构以表示”部分-整体“的层次结构
补充:并且提供给了增加子节点、移除子节点、展示结构的三种方法。
应用场景:出现树形结构的地方,如文件目录显示,多级目录呈现等树形结构数据的操作。
方法:通过继承抽象类来实现

public abstract class Node {protected String name;//名称//构造器赋名public Node(String name){this.name = name;}//新增节点:文件节点无此方法,目录节点重写此方法public void addNode(Node node) throws Exception{throw new Exception("Invalid exception");}//删除节点public void removeNode(Node node)throws Exception{throw new Exception("Invalid exception");}//显示节点:文件与目录均实现此方法abstract void display();
}//文件结点
public class Filer extends Node {public Filer(String name) {super(name);// TODO Auto-generated constructor stub}@Overridevoid display() {// TODO Auto-generated method stubSystem.out.println(name);  }
}//目录结点
public class Noder extends Node{//内部节点列表(包括文件和下级目录)List<Node> nodeList = new ArrayList<Node>();public Noder(String name) {super(name);// TODO Auto-generated constructor stub}//新增节点public void addNode(Node node) throws Exception{nodeList.add(node);}//删除节点public void removeNode(Node node)throws Exception{nodeList.remove(node);}//向下递归打印名称@Overridevoid display() {System.out.println(name);for(Node node:nodeList){node.display();}}
}//测试类
import java.io.File;
public class Clienter {public static void createTree(Node node) throws Exception{File file = new File(node.name);File[] f = file.listFiles();for(File fi : f){//判断结点是不是文件if(fi.isFile()){ //利用绝对路径给结点命名Filer filer = new Filer(fi.getAbsolutePath());node.addNode(filer);}//判断结点是不是目录if(fi.isDirectory()){//利用绝对路径给结点命名Noder noder = new Noder(fi.getAbsolutePath());node.addNode(noder);createTree(noder);//使用递归生成树结构}}}public static void main(String[] args) {Node noder = new Noder("G://WeGame");try {createTree(noder);} catch (Exception e) {e.printStackTrace();}noder.display();}
}

享元模式
描述:用一个类存储共享资源, 运行共享技术有效地支持大量细粒度对象的复用
方式:通过Map集合存储(HashMap)
提供 增加put、获取get 方法

public class Student {private String name;private int  age;public Student(String name,int age){this.name=name;this.age=age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Student [name=" + name + ", age=" + age + "]";}
}import java.util.HashMap;
import org.junit.Test;
public class StudentFactory {static HashMap <String,Student>map=new HashMap<>();public static Student getStudent(String name){if(map.get(name)!=null){return map.get(name);}return null;}public static void addStudent(Student s){map.put(s.getName(), s);}public static void display(){System.out.println(map.entrySet());}@Testpublic void test001(){StudentFactory.addStudent(new Student("luo", 18));   StudentFactory.addStudent(new Student("li", 17));    Student s=      StudentFactory.getStudent("luo");System.out.println(s);StudentFactory.display();}}

外观模式
不改变旧的类的内容,通过一个外观类对相关联的方法经行业务重组。
般用在子系统与访问之间,用于对访问屏蔽复杂的子系统调用,采用耳目一新的外观类提供的简单的调用方法,具体的实现由外观类去子系统调用。(业务逻辑整合)

import org.junit.Test;
public class 外观模式{private FactoryA a=new FactoryA();private FactoryB b=new FactoryB();public void lookplay(){a.funcA();b.funcB();}@Testpublic void test(){new 外观模式().lookplay();}
}
class FactoryA
{public void funcA(){System.out.println("向别人表白"); }
}
class FactoryB
{public void funcB(){System.out.println("答应别人的表白");}
}

代理模式
描述:为第三方对象提供一种代理以控制对象的访问(第三方翻墙行为)
注:适配器是一对多,代理器是一对一的关系。

public interface FactoryInterface {void Breakmaking();
}public class Factory implements FactoryInterface{@Overridepublic void Breakmaking() {// TODO Auto-generated method stubSystem.out.println("生产面包");}
}import org.junit.Test;
public class AgentFactory implements FactoryInterface{FactoryInterface f =new Factory();@Overridepublic void Breakmaking() {// TODO Auto-generated method stubf.Breakmaking();}@Testpublic void test(){new AgentFactory().Breakmaking();}
}

设计模式之结构型模型相关推荐

  1. 4.C++设计模式-结构型模型

    4.C++设计模式-结构型模型 让类和类进行组合,获得更大的结构. 4.1 代理模式 4.1.1 代理模式的理论 代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不 ...

  2. 备战面试日记(3.3) - (设计模式.23种设计模式之结构型模式)

    本人本科毕业,21届毕业生,一年工作经验,简历专业技能如下,现根据简历,并根据所学知识复习准备面试. 记录日期:2022.1.9 大部分知识点只做大致介绍,具体内容根据推荐博文链接进行详细复习. 文章 ...

  3. Java设计模式之结构型:享元模式

    一.什么是享元模式: 享元模式通过共享技术有效地支持细粒度.状态变化小的对象复用,当系统中存在有多个相同的对象,那么只共享一份,不必每个都去实例化一个对象,极大地减少系统中对象的数量.比如说一个文本系 ...

  4. Java设计模式之结构型:组合模式

    前言: 我们对于上面两幅图片肯定非常熟悉,这两幅图片我们都可以看做是一个文件结构,对于这样的结构我们称之为树形结构.在数据结构中我们知道可以通过调用某个方法来遍历整个树,当我们找到某个叶子节点后,就可 ...

  5. Java设计模式之结构型:外观模式

    一.什么是外观模式: 外观模式通过对客户端提供一个统一的接口,用于访问子系统中的一群接口.使用外观模式有以下几点好处: (1)更加易用:使得子系统更加易用,客户端不再需要了解子系统内部的实现,也不需要 ...

  6. Java设计模式之结构型:代理模式

    前言: 我们一般在租房子时会去找中介,为什么呢?因为你对该地区房屋的信息掌握的不够全面,希望找一个更熟悉的人去帮你做:再比如我们打官司需要请律师,因为律师在法律方面有专长,可以替我们进行操作,表达我们 ...

  7. Java设计模式之结构型:装饰器模式

    一.什么是装饰器模式: 当需要对类的功能进行拓展时,一般可以使用继承,但如果需要拓展的功能种类很繁多,那势必会生成很多子类,增加系统的复杂性,并且使用继承实现功能拓展时,我们必须能够预见这些拓展功能, ...

  8. Java设计模式之结构型:适配器模式

    一.什么是适配器模式: 适配器模式主要用于将一个类的接口转化成客户端希望的目标类格式,使得原本不兼容的类可以在一起工作,将目标类和适配者类解耦:同时也符合"开闭原则",可以在不修改 ...

  9. 设计模式 之 结构型模式

    设计模式 之 结构型模式 模式 & 描述 包括 结构型模式 这些设计模式关注类和对象的组合.继承的概念被用来组合接口和定义组合对象获得新功能的方式. 适配器模式(Adapter Pattern ...

最新文章

  1. [TypeScript][文档]变量
  2. c#资源管理器【转】
  3. 一步步编写操作系统 58 门、调用门与RPL序 3
  4. 理论基础 —— 排序 —— 桶排序
  5. appium工作原理及启动方式
  6. mysql 递归查询所有父级
  7. 程序员常用字体(vs字体修改方案)
  8. 解决荣耀magicbook Linux版 无线网卡驱动安装不上的问题
  9. 《用递归法解决问题》教学设计
  10. 普通socket服务端
  11. sqlserver加上百分号_用一条sql语句显示数据百分比并加百分号
  12. iOS 开发商品详情页中的banner中点击查看图片
  13. itss认证费用多少钱
  14. java三张扑克牌,java第三季综合练习之扑克牌游戏
  15. java中result的作用_JAVA中的Resultset
  16. 工程师学乐理(二)音阶及倾向性
  17. 微信接收不到企业微信消息推送
  18. 第六周项目6.3 友元函数实现复数的加法
  19. 网站被DDOS攻击怎么办?防护经验!
  20. 涨知识:直流无刷电机的控制方式

热门文章

  1. 零和博弈-极大极小搜索Alpha-Beta剪枝(井字游戏)
  2. tee啥意思_不知道白tee是什么意思你就out啦!白tee潮流穿搭
  3. java .gml格式_GML格式错误
  4. 小米 android项目代码,[Android] 代码获取手机系统类型(小米MIUI、华为EMUI、魅族FLYME)...
  5. 拒绝洗脑式广告,无限重复洗脑式广告应该受到谴责。怎么有效抵制这类广告?...
  6. 【DEBUG】2021-03-15 不定期的自我检讨001
  7. 用html写个人简历(学生学习所用)
  8. 【JavaWeb04】
  9. PPM、PCM和PWM的区别, I2S与pcm的区别
  10. 该微信用户未开启“公众号安全助手”的消息接收功能,请先开启后再绑定,Java微信公众号开发消息推送公众号用户绑定问题 的解决办法