装饰器模式
装饰器(Decorator)模式的定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式,它属于对象结构型模式。
装饰器模式的主要优点:
- 装饰器是继承的有力补充,比继承灵活,在不改变原有对象的情况下,动态的给一个对象扩展功能,即插即用
- 通过使用不用装饰类及这些装饰类的排列组合,可以实现不同效果
- 装饰器模式完全遵守开闭原则
有些人早餐可能会吃煎饼,煎饼中可以加鸡蛋,也可以加香肠,但是不管怎么“加码”,都还是一个煎饼。在现实生活中,常常需要对现有产品增加新的功能或美化其外观,如房子装修、相片加相框等,都是装饰器模式。
代码如下
public class PanCakeTest {
public static void main(String[] args) {
PanCake panCake = new PanCake();
System.out.println(panCake.getMessage() + "---" + panCake.getPrice());
// 加一个鸡蛋
EggDecorator eggDecorator = new EggDecorator(panCake);
System.out.println(eggDecorator.getMessage() + "---" + eggDecorator.getPrice());
//再加一个鸡蛋
EggDecorator eggDecorator1 = new EggDecorator(eggDecorator);
System.out.println(eggDecorator1.getMessage() + "---" + eggDecorator1.getPrice());
// 加一根香肠
SausageDecorator sausageDecorator = new SausageDecorator(eggDecorator1);
System.out.println(sausageDecorator.getMessage() + "---" + sausageDecorator.getPrice());
}
}
// 煎饼类
class PanCake {
String getMessage() {
return "煎饼";
}
int getPrice() {
return 5;
}
}
// 装饰器
abstract class Decorator extends PanCake {
private PanCake panCake;
public Decorator(PanCake panCake) {
this.panCake = panCake;
}
@Override
String getMessage() {
return this.panCake.getMessage();
}
@Override
int getPrice() {
return this.panCake.getPrice();
}
}
// 鸡蛋煎饼装饰器
class EggDecorator extends Decorator {
public EggDecorator(PanCake panCake) {
super(panCake);
}
@Override
String getMessage() {
return super.getMessage() + "1个鸡蛋";
}
@Override
public int getPrice() {
return super.getPrice() + 1;
}
}
// 香肠装饰器
class SausageDecorator extends Decorator {
public SausageDecorator(PanCake panCake) {
super(panCake);
}
@Override
String getMessage() {
return super.getMessage() + "1根香肠";
}
@Override
public int getPrice() {
return super.getPrice() + 2;
}
}
1.http://c.biancheng.net/view/1366.html
代码地址:https://gitee.com/zhoujie1/design-mode-and-principle.git