设计模式---结构型模式(代理模式、组合模式、组合模式、装饰器模式 持续更新。。。下一个享元模式21/4/26)

本文介绍了设计模式中的代理模式、组合模式、外观模式和装饰器模式,通过实例展示了它们在软件开发中的应用场景。代理模式用于创建代理对象以控制对原对象的访问,组合模式用于构建部分-整体的树形结构,外观模式提供了一个统一的接口简化系统访问,装饰器模式则动态地扩展对象功能。这四种模式在提高代码复用性和降低耦合度方面起到了关键作用。
摘要由CSDN通过智能技术生成

对设计模式出于学习阶段没有啥高深的见解,本文主要讲的是自己的感悟与在自己实践中可能用到的地方,后续会有自己项目中的总结,全面学习还是进链接里,我就不赘述啦
文章链接:代理模式.

代理模式

先说几个例子:
1、Windows 里面的快捷方式。
2、猪八戒去找高翠兰结果是孙悟空变的,可以这样理解:把高翠兰的外貌抽象出来,高翠兰本人和孙悟空都实现了这个接口,猪八戒访问高翠兰的时候看不出来这个是孙悟空,所以说孙悟空是高翠兰代理类。
3、买火车票不一定在火车站买,也可以去代售点。
4、一张支票或银行存单是账户中资金的代理。支票在市场交易中用来代替现金,并提供对签发人账号上资金的控制。
总结一下例子的共同点:
原来有个真正的东西,但是因为距离太远、代价太大、成本太高、不安全,为了解决之前的问题,设立一个代理

实际应用中,应该会用到的地方:
1.加载图片,原本有一个专门远程加载图片的类,现在出来一个代理类,功能就是原来没用过这个图片,远程加载。用过了就用缓存里加载好的,第一加载过,第二次就不用加载啦
2.前端请求后端的数据,不是变化的数据,在前端找个代理存上,想用就用,要存啥数据,想好了,别让人钻了空子

Image.java

public interface Image {
   void display();
}

RealImage.java


public class RealImage implements Image {
 
   private String fileName;
 
   public RealImage(String fileName){
      this.fileName = fileName;
      loadFromDisk(fileName);
   }
 
   @Override
   public void display() {
      System.out.println("Displaying " + fileName);
   }
 
   private void loadFromDisk(String fileName){
      System.out.println("Loading " + fileName);
   }
}

ProxyImage.java


public class ProxyImage implements Image{
 
   private RealImage realImage;
   private String fileName;
 
   public ProxyImage(String fileName){
      this.fileName = fileName;
   }
 
   @Override
   public void display() {
      if(realImage == null){
         realImage = new RealImage(fileName);
      }
      realImage.display();
   }
}

ProxyPatternDemo.java

public class ProxyPatternDemo {
   
   public static void main(String[] args) {
      Image image = new ProxyImage("test_10mb.jpg");
 
      // 图像将从磁盘加载
      image.display(); 
      System.out.println("");
      // 图像不需要从磁盘加载
      image.display();  
   }
}

执行程序,输出结果:

Loading test_10mb.jpg
Displaying test_10mb.jpg

Displaying test_10mb.jpg

组合模式

道(意图、存在根本)

1.它在我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。
2.高层模块调用简单。
3、节点自由增加。

天(何时)

1、您想表示对象的部分-整体层次结构(树形结构)。 2、您希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。

地(在哪用)

部分、整体场景,如树形菜单,文件、文件夹的管理。

将(用谁)

1.树形结构 1.树杈(大哥)、叶子(小弟) 链表用来装直属小弟

法(怎么用)

树枝和叶子实现统一接口,树枝内部组合该接口。

缺点

在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了 依赖倒置原则
个人理解:
依赖倒置原则,使用于继承或实现接口,层次少的情况下使用,像套娃一样的继承,还是挺难维护的,鱼和熊掌不可兼得,需要平衡

实例

实现一个公司的管理结构

老板
中层管理
中层管理
中层管理
员工
员工
员工
员工
员工
员工
员工
员工
员工

想看参照看参照链接
参照链接: 组合模式.

外观模式(Facade pattern)

个人感受:
1.封装是面向对象的思想,单一模块(高内聚、低耦合)便于了维护,但单一模块特别多了该怎么办那,外观模式就是处理这个问题的,把更多的模块接口捋清楚,放在一个类里

1.降低访问复杂系统的内部子系统时的复杂度,简化客户端与之的接口。

1、客户端不需要知道系统内部的复杂联系,整个系统只需提供一个"接待员"即可。 2、定义系统的入口。

1.在客户端和复杂系统之间再加一层,这一层将调用顺序、依赖关系等处理好。
2.为复杂的模块或子系统提供外界访问的模块。
3.子系统相对独立。
4.预防低水平人员带来的风险。

在客户端和复杂系统之间再加一层,这一层将调用顺序、依赖关系等处理好。

客户端不与系统耦合,外观类与系统耦合。

比喻
1、去医院看病,可能要去挂号、门诊、划价、取药,让患者或患者家属觉得很复杂,如果有提供接待人员,只让接待人员来处理,就很方便。
2、JAVA 的三层开发模式。

想看实例看参照链接
参照链接: 外观模式.

装饰器模式(Decorator Pattern)

道(存在的理由)

动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。

天(什么时候用)

在不想增加很多子类的情况下扩展类。

地(在哪用)

1、扩展一个类的功能。 2、动态增加功能,动态撤销。

将(用谁解决问题)

1、Component 类充当抽象角色,不应该具体实现。 2、修饰类引用和继承 Component 类,具体扩展类重写父类方法。

法(具体方法)

可代替继承。

实例

1.孙悟空72变,杨戬73变,这时候都变 庙宇
(1)孙悟空一个类,杨戬一个类,变化的东西是一个类
(2)孙悟空,杨戬的类自己想
(3)变化的东西类,实现方法:将谁谁谁的实例传进来,方法1:变身(变成啥){具体执行}
孙悟空还是孙悟空,可以干别的事,干别的事时,不用带着这些方法
想看实例看参照链接
参照链接: 装饰器模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值