1.装饰模式(Decorator)的定义:又名包装(Wrapper)模式,装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。
2.装饰模式以对客户端透明的方式动态的给一个对象附加上更多的责任。换言之客户端并不会觉的对象在装饰前和装饰后有什么区别。
3.装饰模式可以在不创造更多的子类的模式下,将对象的功能加以扩展。
具体案列
本例中 抽象构建角色由Programmer程序员接口扮演
具体构件角色由类汤高扮演 他实现了程序员具有的功能
装饰构件由 类Derector扮演 它必须也实现抽象构件接口
具体装饰构件角色由 类Hacker(黑客) 和类 SoftwareAchitect(架构师)扮演
具体程序员汤高有编程能力,上帝可以给他赋予更多能力 每赋予一种能力,他就多一个技能 这是通过装饰构件实现的
抽象构件角色
/**
* 抽象构件角色
* 程序员接口 程序员具有编程的能力
* @author Administrator
*
*/
public interface Programmer {
//编程
public void programme();
}
具体构件角色
/**
* 具体构件角色
* 汤高是一个具体的程序员
* 那么他就具有编程能力
* @author Administrator
*
*/
public class 汤高 implements Programmer {
@Override
public void programme() {
System.out.println("我是一个程序员, 我能编程");
}
}
装饰角色
/**
* 装饰角色
*
* @author Administrator
*
*/
public class Derector implements Programmer{
private Programmer programmer;
public Derector(Programmer programmer) {
this.programmer = programmer;
}
@Override
public void programme() {
programmer.programme();
//附加的责任或者功能
}
}
具体装饰角色1
/**
* 具体装饰角色
* 黑客类 他具有附加的功能 他能入侵别人的电脑
* @author Administrator
*
*/
public class Hacker extends Derector {
public Hacker(Programmer programmer) {
super(programmer);
}
@Override
public void programme() {
super.programme();
//附加的责任或者功能
System.out.println("我具有黑客的技能 我能入侵别人的电脑");
}
}
具体装饰角色2
/**
* 具体装饰角色
* 软件架构师类 他具有附加的功能 能设计总个网站或系统的骨
* @author Administrator
*
*/
public class SoftwareArchitect extends Derector {
public SoftwareArchitect(Programmer programmer) {
super(programmer);
}
@Override
public void programme() {
super.programme();
//附加的责任或者功能
System.out.println("我具有架构师的技能 我能设计总个网站或系统的骨架");
}
}
客户端
public class Client {
public static void main(String[] args) {
//创建构件对象 汤高 ->他是一个具体的程序员
//但是现在他只有编程能力 那怎么行
//必须赋予他更大的能力 不然怎么赚大钱!
//所以 上帝给他装饰了一番 瞬间提神了他的B格
Programmer programmer=new 汤高();
//装饰类登场 屌丝 我来装饰你 让你具有更大的能力
Derector hacker=new Hacker(programmer);
//这下汤高这个屌丝程序员就具有黑客的技能包了
//这下就没有谁敢叫他屌丝了吧 哈哈 不然分分钟让你电脑崩溃
System.out.println("第一次装饰");
hacker.programme();
//程序员还不满足 他还要更多的技能 因为他要逆袭
//所以上帝再给他装饰了一下
//在他具有黑客技能的基础上另外赋予了他架构师的功能
System.out.println("--------------第二次装饰");
Derector achitect=new SoftwareArchitect(hacker);
achitect.programme();
//也可以一步装饰两个技能 因为他们有共同的父类抽象构件接口 Programmer
System.out.println("------------一步装饰两个技能");
Derector achitect1=new SoftwareArchitect( new Hacker(new 汤高() ) );
achitect1.programme();
}
}
结果:
第一次装饰
我是一个程序员, 我能编程
我具有黑客的技能 我能入侵别人的电脑
————–第二次装饰
我是一个程序员, 我能编程
我具有黑客的技能 我能入侵别人的电脑
我具有架构师的技能 我能设计总个网站或系统的骨架
————一步装饰两个技能
我是一个程序员, 我能编程
我具有黑客的技能 我能入侵别人的电脑
我具有架构师的技能 我能设计总个网站或系统的骨架
使用时只需要将需要的已有的功能(一个个继承了Derector的类)一个一个new进去即可