装饰器模式个人感觉就是一种高级的组合。高级就在于它是一种解耦合的组合。(现在有一个a、架构师;b、java;c、建筑。我现在要组建一个Java架构师但他同样会设计建筑的架构你会建立一个d、里面包含abc;但是装饰器是这样组合的c中包含ab;b中包含a;大概就是这样,虽然例子很low但也能理解其中含义吧!后面有代码解释)
装饰器模式:顾名思义它的的用途就是装饰用的;装饰什么呢?当然装饰你的核心代码,如果把所有东西写到核心那么你的核心代码体量未免就太大了,大了就难维护了;架构师就是你的核心,而java和建筑就是装饰架构师的。
装饰的好处就在于把类的核心职责和装饰功能区分开,而且可以去除相关类重复的逻辑。同样你要给类新增功能不用动核心,直接加装饰就行了。
下面代码一个抽象类soa,核心类ChinaSoa和ForeignSoa装饰器DecorationSoa装饰的功能HouseSoa和JavaSoa
public abstract class Soa {
/*搭建架构*/
public abstract void CreateSoa();
}
public class ChinaSoa extends Soa {
private Soa soa;
@Override
public void CreateSoa() {
System.out.println("我是来自中国的架构师");
}
public void setSoa(Soa soa) {
this.soa = soa;
}
}
public class HouseSoa extends DecorationSoa {
@Override
public void CreateSoa() {
System.out.println("我会搭建房子的架构");
}
}
public abstract class DecorationSoa extends Soa {
public Soa soa;
public void setSoa(Soa soa) {
this.soa = soa;
}
@Override
public abstract void CreateSoa();
}
public class HouseSoa extends DecorationSoa {
@Override
public void CreateSoa() {
System.out.println("我会搭建房子的架构");
}
}
public class JavaSoa extends DecorationSoa {
@Override
public void CreateSoa() {
super.soa.CreateSoa();
System.out.println("我会搭建java架构");
}
}
public class test {
public static void main(String[] args) {
/*创建国外的架构师*/
Soa foreignsoa = new ForeignSoa();
/*创建国内的架构师*/
Soa chainsoa = new ChinaSoa();
System.out.println("下面是一个来自国外建房架构师并且会打java架构");
DecorationSoa hos = new HouseSoa();
DecorationSoa javasoa = new JavaSoa();
/*赋予架构师盖房子的特性*/
hos.setSoa(foreignsoa);
/*赋予架构师搭建java的特性*/
javasoa.setSoa(hos);
javasoa.CreateSoa();
}
}
控制台输出===========
下面是一个来自国外建房架构师
我会搭建房子的架构
我会搭建java架构
那么如果我们想要一个会c++的架构师,我们只需要创建c++的导出类,并将其特性赋予架构师便好。