设计模式之装饰者模式

原创
2017/05/04 20:48
阅读数 29

装饰者模式的主要角色有:

(1)抽象组件:定义一个抽象接口,来规范准备附加功能的类

(2)具体组件:将要被附加功能的类,实现抽象构件角色接口

(3)抽象装饰者:持有对具体构件角色的引用并定义与抽象构件角色一致的接口

(4)具体装饰:实现抽象装饰者角色,负责对具体构件添加额外功能。

实现代码如下:

Component

public interface Person {

    void eat();
}

ConcreteComponent

public class Man implements Person {

    public void eat() {
        System.out.println("男人在吃");
    }
}

Decorator

public abstract class Decorator implements Person {

    protected Person person;
    
    public void setPerson(Person person) {
        this.person = person;
    }
    
    public void eat() {
        person.eat();
    }
}

ConcreteDectrator

public class ManDecoratorA extends Decorator {

    public void eat() {
        super.eat();
        reEat();
        System.out.println("ManDecoratorA类");
    }

    public void reEat() {
        System.out.println("再吃一顿饭");
    }
}
public class ManDecoratorB extends Decorator {
    
    public void eat() {
        super.eat();
        System.out.println("===============");
        System.out.println("ManDecoratorB类");
    }
}

Test

public class Test {

    public static void main(String[] args) {
        Man man = new Man();
        ManDecoratorA md1 = new ManDecoratorA();
        ManDecoratorB md2 = new ManDecoratorB();
        
        md1.setPerson(man);
        md2.setPerson(md1);
        md2.eat();
    }
}

上面的代码很简单,就是将target作为参数传递给装饰者对象,而我们可以直接访问装饰对象,这样,我们就实现了对target的加强。

从代码层面来看,装饰者模式和代理模式很像,几乎可以说是一模一样。但是既然是设计模式,那么重要的并不是代码,而是其思想。代理模式的核心在于对target访问的控制,举个例子,老板要开会,秘书就要把准备工作和收尾工作做好,如果准备工作没做好,那么老板也不能来开会,而且开会的人也只能是老板,也就是说,代理模式虽然调用的是代理对象,但是核心还是target,装饰者模式就不同,它的核心在于对target对象的增强,比如说我要去买电脑,找个懂电脑的朋友帮我去买,这个朋友能从我这里得到他想要的信息,在买电脑的时候,其实是不是我执行这个买的动作都可以。而且一般来说,代理模式的target对象不是由用户传进来的,因为他根本不知道target的存在,而装饰者模式的target都是由用户当参数传递给装饰对象的。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部