设计模式中,装饰者、适配器和外观模式这三种模式运用的比较多,但三者有一定的相似性,所以比较不好区分,今天我就来详细谈谈这三个模式。
1、装饰者模式
《设计模式》上的定义为:动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案,装饰者模式的关键点是装饰者和被装饰者对象有相同的超类型,所以可以在任何需要原始对象的场合用装饰过的对象代替它。装饰者可以在所委托被装饰者的行为之前与之后,加上自己的行为,以达到特定的目的。
public abstract class component //元素超类,提供类型和方法
{
public String com_description()
{
}
public abstract int get_weight()
{
}
}
public abstract class special_comp extends component //继承自超类,修饰对象的父类
{
public String com_description()
{
}
}
public class comp_1 extends special_comp //修饰对象
{
component com;
public comp_1(component com)
{
this.com=com;
}
public String com_description()
{
//***实现
}
public abstract int get_weight()
{
//***实现
}
}
修饰对象和被修饰对象都拥有一个共同的超类,这使得修饰对象和被修饰对象拥有共同的类型,就可以通过超类来传递子类对象,这样就可以它们之间可以相互包含。
2、适配器模式
定义:将一个类的接口,转换成客户期望的另一个接口。适配器让原来接口不兼容的类可以合作无间,适配器模式包括对象适配器和类适配器,两者实现的方式有很大的区别,类适配器是通过继承的方式,使目标接口和被适配接口作为适配器的父类(多继承),而对象适配器则是通过对目标结构的重新实现,并与被适配器是组合关系,这样做的优势是被适配者的任何子类我们都可以配接该适配器。
对象适配器:适配器与被适配对象是组合关系,适配器与适配对象是实现关系(继承);
类适配器:适配器对象继承继承自适配对象和被适配对象。
3、外观模式
通过提供一个统一的接口,用来访问子系统中的一群接口,外观定义了一个高层接口,让子系统更容易使用。我们只是把实现一个功能的所有重复繁琐的操作封装成一个简单的接口,而对子系统没有影响。
简单的组合关系(has-a)关系就可以实现。
三者区别:
装饰者模式不会改变类的接口,他只是每次封装时都会增加新的责任;
配接器模式改变接口但功能不增不减,外观模式则是通过一个类管理所有的子系统,然后提供一个接口是接口简单,两者的目的不一样,一个为了改变接口、一个为了使接口简单。