定义:动态地给一个对象添加一些额外的职责。也就是扩展功能,装饰者模式相对于继承产生子类更加灵活,便于代码的复用,就像彩虹(被装饰者),彩虹由好几种颜色(装饰者)组成,颜色可以随意排列、添加。
重点:装饰者与被装饰者拥有共同的基类,继承的目的是继承类型,而不是行为。
代码实现:
/**
* 被装饰者
*/
public interface Eat {
public abstract void eat();
}
装饰者
/**
* 装饰者
* @author asus
*
*/
public abstract class AEat implements Eat{
private Eat eat;
public AEat(Eat eat) {
this.eat=eat;
}
@Override
public void eat() {
eat.eat();
}
}
对装饰者AEat的一个细化
/**
* 装饰者
*/
public class BEat extends AEat{
public BEat(Eat eat) {
super(eat);
}
@Override
public void eat() {
super.eat();
System.out.println("加点醋!");
}
/**
* 装饰者
*/
public class CEat extends AEat {
public CEat(Eat eat) {
super(eat);
}
@Override
public void eat() {
super.eat();;
System.out.println("多放辣椒");
}
}
/**
* 装饰者
*/
public class DEat extends AEat{
public DEat(Eat eat) {
super(eat);
}
@Override
public void eat() {
super.eat();;
System.out.println("今天吃鸡");
}
}
/**
* 被装饰者的实现类,本身就有方式的实现
*/
public class TsetEat implements Eat{
@Override
public void eat() {
System.out.println("我今天吃什么呢?");
}
}
/**
* 测试
*/
public class Test {
public static void main(String[] args) {
//创建了一个吃的类,但是不满意现有的行为,还要对这个吃类进行装饰
Eat eat = new TsetEat();
//对eat的装饰,可以随意组合装饰者,执行的结果也将不一样。
Eat e = new CEat(new BEat(new DEat(eat)));
e.eat();
}
}
执行结果: