java设计模式(装饰模式)

装饰模式实现了可以动态地为原对象扩展方法

装饰对象与被装饰的都实现了同一个接口(或抽象类)

举个例子: 工作 可以边吃东西边工作,也可以边喝东西边工作,还可以工作的时候边吃边喝

创建共同接口 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();
    }
}

输出结果:

我正在工作
顺便喝茶
================================
我正在工作
顺便吃东西
================================
我正在工作
顺便吃东西
顺便喝茶
================================
我正在工作
顺便喝茶
顺便吃东西

 

posted on 2016-04-12 16:12  oldcowstruggle  阅读(126)  评论(0编辑  收藏  举报