设计模式设计模式

设计模式—装饰模式

2016-06-04  本文已影响175人  HJXANDHMR

本博客同步发表在 http://hjxandhmr.github.io/2016/06/04/DesignPattern-Decorator/
今天我们来学习另一种结构型模式,它就是装饰模式(Decorator Pattern)。

模式定义

动态地给一个对象增加一些额外的职责(Responsibility),就增加对象功能来说,装饰模式比生成子类实现更为灵活。

模式结构

装饰模式包含如下角色:

**Component: ** 抽象构件
**ConcreteComponent: ** 具体构件
**Decorator: ** 抽象装饰类
**ConcreteDecorator: ** 具体装饰类

UML图

代码实现

孙悟空有七十二般变化,他的每一种变化都给他带来一种附加的本领。他变成鱼儿时,就可以到水里游泳;他变成鸟儿时,就可以在天上飞行。

本例中,Component的角色便由鼎鼎大名的齐天大圣扮演;ConcreteComponent的角色属于大圣的本尊,就是猢狲本人;Decorator的角色由大圣的七十二变扮演。而ConcreteDecorator的角色便是鱼儿、鸟儿等七十二般变化。

TheGreatestSage.java


public interface TheGreatestSage {

    public void move();
}

Monkey.java

/**
 * 具体构件
 */
public class Monkey implements TheGreatestSage {

    @Override
    public void move() {
        //代码
        System.out.println("Monkey Move");
    }
}

Change.java


/**
 * 抽象装饰类
 */
public class Change implements TheGreatestSage {
    private TheGreatestSage sage;

    public Change(TheGreatestSage sage){
        this.sage = sage;
    }

    @Override
    public void move() {
        // 代码
        sage.move();
    }

}

Bird.java

/**
 * 具体装饰类
 */
public class Bird extends Change {

    public Bird(TheGreatestSage sage) {
        super(sage);
    }

    @Override
    public void move() {
        System.out.println("Bird Move");
    }

    public void fly() {
        System.out.println("Bird fly");
    }
}

Fish.java


/**
 * 具体装饰类
 */
public class Fish extends Change {

    public Fish(TheGreatestSage sage) {
        super(sage);
    }

    @Override
    public void move() {
        System.out.println("Fish Move");
    }

    public void swim() {
        System.out.println("Fish swim");
    }
}

测试类


public class MyClass {
    public static void main(String[] args) {
        TheGreatestSage sage = new Monkey();
        //孙悟空变成一只鸟
        Bird bird = new Bird(sage);
        bird.move();
        bird.fly();

        //孙悟空变成一只鱼
        Fish fish = new Fish(sage);
        fish.move();
        fish.swim();
    }
}

运行结果

模式分析

装饰模式的优点

装饰模式的缺点

参考
http://design-patterns.readthedocs.io/zh_CN/latest/structural_patterns/decorator.html

欢迎大家关注我的微信公众号,我会不定期的分享些Android开发的技巧

上一篇下一篇

猜你喜欢

热点阅读