对设计模式出于学习阶段没有啥高深的见解,本文主要讲的是自己的感悟与在自己实践中可能用到的地方,后续会有自己项目中的总结,全面学习还是进链接里,我就不赘述啦
文章链接:代理模式.
代理模式
先说几个例子:
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:变身(变成啥){具体执行}
孙悟空还是孙悟空,可以干别的事,干别的事时,不用带着这些方法
想看实例看参照链接
参照链接: 装饰器模式