装饰模式实现了可以动态地为原对象扩展方法
装饰对象与被装饰的都实现了同一个接口(或抽象类)
举个例子: 工作 可以边吃东西边工作,也可以边喝东西边工作,还可以工作的时候边吃边喝
创建共同接口 WorkComponent
1 package com.zhanghaobo.patterns; 2 3 public interface WorkComponent { 4 public void work(); 5 }
具体工作(被装饰的对象)
1 public class ConcreteWork implements WorkComponent { 2 3 @Override 4 public void work() { 5 System.out.println("我正在工作"); 6 7 } 8 9 }
装饰类
1 public class DecoratorWork implements WorkComponent { 2 private WorkComponent work; 3 public DecoratorWork(WorkComponent work){ 4 this.work=work; 5 } 6 @Override 7 public void work() { 8 work.work(); 9 } 10 11 }
装饰1(喝茶)
1 public class DrinkDecorator extends DecoratorWork { 2 3 public DrinkDecorator(WorkComponent work) { 4 super(work); 5 } 6 @Override 7 public void work() { 8 super.work(); 9 drinkTea(); 10 } 11 public void drinkTea(){ 12 System.out.println("顺便喝茶"); 13 } 14 15 }
装饰2(吃东西)
public class EatDecorator extends DecoratorWork { public EatDecorator(WorkComponent work) { super(work); } @Override public void work() { super.work(); eatSomething(); } public void eatSomething(){ System.out.println("顺便吃东西"); } }
TEST:
public class Client { public static void main(String[] args) { //边喝茶边工作 WorkComponent wc=new DrinkDecorator(new ConcreteWork()); wc.work(); System.out.println("================================"); //边吃东西边工作 WorkComponent wc1=new EatDecorator(new ConcreteWork()); wc1.work(); System.out.println("================================"); //边吃边喝地工作 WorkComponent wc2=new DrinkDecorator(new EatDecorator(new ConcreteWork())); wc2.work(); System.out.println("================================"); //边喝边吃地工作 WorkComponent wc3=new EatDecorator(new DrinkDecorator(new ConcreteWork())); wc3.work(); } }
输出结果:
我正在工作 顺便喝茶 ================================ 我正在工作 顺便吃东西 ================================ 我正在工作 顺便吃东西 顺便喝茶 ================================ 我正在工作 顺便喝茶 顺便吃东西