装饰模式
装饰模式是在不改变原类文件和使用继承的方式,动态地扩展一个对象的功能。它是创建一个包装对象,也就是装饰来包裹对象。
具体角色:
1:抽象构件角色(Component):给出一个抽象接口,以规范准备接收附加责任的对象。
2:具体构件角色(Concrete Component):定义一个将要接收附加责任的类。
3:装饰角色(Decorator):持有一个构件对象的实例,并实现一个与抽象构件接口一致的接口
4:具体装饰角色(Concrete Component):负责给构建对象添加上附加的责任。
UML:
例:
需求:
卖汉堡,可以添加配料及价格,不影响原来的代码。
代码示例
抽象构件角色
/**
* 装饰模式
* 抽象构件角色:汉堡类
*
*/
public interface Humburger {
void sell();
}
具体构件角色
/**
* 装饰模式
* 具体构件类:鸡腿堡
*
*/
public class ChickenHumBurger implements Humburger{
@Override
public void sell() {
// TODO Auto-generated method stub
System.out.println("卖鸡腿堡");
}
}
具体装饰者
/**
* 装饰模式
* 具体装饰者:增加配料
*
*/
public class Batch implements Humburger{
private Humburger humburger;
@Override
public void sell() {
// TODO Auto-generated method stub
humburger.sell();
System.out.println("配料为:辣椒,生菜....");
}
public void setHumburger(Humburger humburger) {
this.humburger = humburger;
}
}
/**
* 装饰模式
* 具体装饰者:增加价格修饰
*
*/
public class Price implements Humburger{
private Humburger humburger;
@Override
public void sell() {
// TODO Auto-generated method stub
humburger.sell();
System.out.println("价格为:15元");
}
public void setHumburger(Humburger humburger) {
this.humburger = humburger;
}
}
客户端调用
public class Client {
public static void main(String[] args) {
ChickenHumBurger chickenHumBurger=new ChickenHumBurger();
Batch batch=new Batch();
Price price=new Price();
batch.setHumburger(chickenHumBurger);
price.setHumburger(batch);
price.sell();
}
}