装饰设计模式定义
在不必改变原类文件和继承的情况下,动态的扩展一个类的功能,它是通过创建一个包装类对象,也就是装修来包裹真实对象!
装饰设计模式的特点
1,装饰类对象与和真实对象实现了同一个接口,这样客户端对象就能以和真实对象相同的方式与装饰对象进行交互!
2,装饰对象包含一个真实对象的引用(reference)
3,装饰对象接收所有客户端对象的请求,会把这些请求转交给真实对象。
4,装饰对象在将客户端的请求转交给真实对象前或后增加一些附加功能,这样就保证了在运行时,不改变真实对象的结构实现了对其功能的扩展。(在
面向对象的设计中通常是通过继承现实的,但是装饰设计模式比继承更加的灵活)
装饰设计模式的缺点
过渡使用会是程序变得复杂
装饰模式的具体较色
1,抽象构件(component)角色:给出一个抽象接口,以规范准备接受附加责任的对象。
2,具体构件(concretecomponent)角色:定义一个将要接收附加责任的对象。
3,装饰(decorator)角色:持有一个抽象构件的实例,重写抽象构件接口的抽象方法。
4,具体装饰(concretedecorator):负责给构件对象添加上附加责任。
装饰设计模式的结构图
源码:
抽象构件角色:
public interface Component {
//规范动作
public abstract void simpleOperation();
}
public class ConcreteComponent implements Component{
@Override
public void simpleOperation() {
//编写相关的业务代码
}
}
装饰角色:
public class Decorator implements Component{
Component mComponent;
public Decorator(Component component) {
mComponent=component;
}
@Override
public void simpleOperation() {
//委派任务给构件
mComponent.simpleOperation();
}
}
具体装饰角色:
public class ConcreteDecorator extends Decorator{
public ConcreteDecorator(Component component) {
super(component);
}
@Override
public void simpleOperation() {
//添加附件责任
super.simpleOperation();
//添加附加责任
}
}
装饰设计模式的实例应用
比如说一把刀,当它是菜刀时可以用来切菜,当它是砍柴刀时可以用来砍柴,当它是武士刀时,可以用来决斗!
源码:
1,抽象构件
public interface Action {
//砍得动作
public void cut();
}
/**
* 具体构件(刀)
*/
public class Sword implements Action{
@Override
public void cut() {
System.out.println("刀在使用");
}
}
3,装饰角色
public class DecoratorSword implements Action{
Action ac;
public DecoratorSword(Action ac) {
this.ac=ac;
}
@Override
public void cut() {
//分派责任
ac.cut();
}
}
4,装饰具体角色
/**
* 装饰具体角色(菜刀)
*/
public class CookKnife extends DecoratorSword{
public CookKnife(Action ac) {
super(ac);
// TODO Auto-generated constructor stub
}
@Override
public void cut() {
System.out.println("刀在切菜");
}
}
/**
* 装饰具体角色(砍柴刀)
*/
public class ChopingWoodKnife extends DecoratorSword{
public ChopingWoodKnife(Action ac) {
super(ac);
// TODO Auto-generated constructor stub
}
@Override
public void cut() {
System.out.println("刀在砍柴");
}
}
测试代码:
public class TestDecorator {
public static void main(String[] args) {
Action sword= new Sword();
Action cookKnife=new CookKnife(sword);
Action chopingWoodKnife=new ChopingWoodKnife(sword);
cookKnife.cut();
chopingWoodKnife.cut();
}
}
测试结果:
刀在切菜
刀在砍柴