初识设计模式(二)

😄

一、依赖倒转原则

面向对象原则之三。

官方:高层模块不应该依赖于低层模块,二者都应该依赖于抽象。

抽象不应该依赖于细节,细节应该依赖于抽象。

注:高层模块在java中指的是调用端,低层模块和细节是具体的实现类,抽象就是接口或抽象类。这就是俗称的面向接口编程。

举个高层模块依赖低层模块的栗子,要写人玩手机,Person类中增加玩手机这个方法。这时我要增加需求,要写人玩电脑,就要在Person类中更改代码,这无疑违反了开闭原则。让手机实现Product接口的话,就算再加需求,只需要增加一个实现接口的类就好了,不用更改Person类中的代码。

二、里氏代换原则

面向对象原则之四。

里氏代换原则是Barbara Liskov女士在1988年发表的:一个软件实体如果使用的是一个父类的话,那么一定适用于其子类,而且它察觉不出父类对象和子类对象的区别。

也就是说,在程序里,把父类换成子类,程序没变化。

简单点,子类必须能代替父类。

通俗点,就是子类扩展父类功能,但不能改变父类原有功能。

通过抽象去建立规范,然后用实现去扩展细节;里氏代换原则和开闭原则相互依存。

三、装饰模式

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

Component定义一个对象接口,可以个给这些对象动态地添加职责。

ConcreteComponent是定义了一个具体的对象,也可以添加职责。

Decorator继承Component,扩展其功能。

例:(伪代码)
class Person{
public Person(){}
private String name;
public Person(String name){
this.name = name;
}
public virtual void Show(){
println("装扮的"+name);
}
}
class PersonWithClothes : Person{
protected Person component;
public void Decorate(){
this.component = component;
}
public override void Show(){
if(component!=null){
component.Show();
}
}
}
class Tsherts:PersonWithClothes{
public void Show(){
println("T恤");
base.Show();
}
}
......

上例中Person就相当于ConcreateComponent,PersonWithClothes就是Decorate,T-shirt等就是实现Decorate的具体类。

在客户端:

Person person = new Person("xxx");
Tshirt t = new Tshirt();
Pants p = new Pants();
Shoes s = new Shoes();
t.Decorate(person);
p.Decorate(t);
s.Decorate(p);
s.Show();

每一次的Decorate都把原始对象的职责进行扩展,一层一层穿衣服。每一次只需调用上一次扩展完的对象。

s.show()时调用base.show(),去执行p的show()方法,以此类推。 它把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象,因此,客户代码可以在运行时根据需要有选择地,按顺序地使用装饰功能包装对象。

四、代理模式

官方:为其他对象提供一种代理以控制对这个对象的访问。

1.远程代理。为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。

2.虚拟代理。根据需要创建开销很大的对象。通过对它来存放实例化需要很长时间的真实对象。比如加载网页时,看到所有的文字,但图片却要一张张下载。那些未打开的图片框,就是通过虚拟代理替代了真实的图片,代理存储了真实图片的路径和尺寸。

3.安全代理。控制不同对象的访问权限。

4.智能指引。当调用真实的对象时,代理处理另外一些事。

 

如上图,真实对象和代理都要实现同一个接口的方法,只不过具体的实现方法不同。在客户调用时直接调用代理,代理调用的真实对象。

实例:windows的快捷方式,火车票代售。

五、工厂方法模式

官方:定义一个用于创建对象的接口,让子类决定实例化哪个类。工厂方法使一个类的实例化延迟到其子类。

工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现运算类。工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行。这样当你增加需求时,增加运算类,增加工厂方法。这就符合了开闭原则。

posted @ 2020-04-13 21:16  Xiao-zhi  阅读(115)  评论(0)    收藏  举报