设计模式 – 装饰模式(Decorator)

本文通过两个实例详细介绍了装饰模式在程序设计中的应用。首先通过一个外出打扮的例子展示了如何通过装饰模式为基本对象添加不同的职责,其次通过修饰字符串的实例进一步说明了装饰模式的灵活性和可扩展性。

问 题的提出:一个人装扮,可以先穿裤子,再穿衣服,再穿鞋子;也可以先穿衣服,再是裤子,再是鞋子,由于裤子、衣服、鞋子种类很多,故搭配种类就更多了。又 如制作蛋糕,鲜奶油蛋糕、草莓蛋糕或生日蛋糕其实都是蛋糕,这是装饰手法不同而已。因此,如果在程序中采用简单的各个类顺序调用的方法为其装饰,那么程序 就会显得相当不灵活,其他的可维护性、可扩展性、可复用性也可想而知了。对此,我们可以采用装饰模式: 

说明:

ü  Component定义了一个对象接口,可以给这些对象动态地添加职责;

ü  ConcreteComponent定义了一个具体的对象,也可以给这个对象添加一些职责;

ü  Decorator定义了装饰抽象类,继承了Component,从外类来扩展Component类的

功能,但对于Component来说,无需知道Decorator的存在的,至于ConcreteDecorator就是具体的装饰对象,起到给Component添加职责的功能;

ü  SetComponent是用来对对象进行包装(以及再包装的,实际中也可以使用构造函数实

),这样每个装饰对象的实现就和如何使用这个对象分离开了,每个装饰对象只关心自己的功能,不需要关心如何被添加到对象链当中(之所以能被添加到对象链当中,在于每个ConcreteDecorator都实现了Decorator,而Decorator又实现了Component,故每个装饰好的东西自然可以看作新的装饰,然后作为参数的形式传进去,这样做最大的好处在于:装饰的顺序可以随意定,待装饰好后再展示最后的装饰结果”)

ü  程序中如果只有一个ConcreteComponent类而没有抽象的Component类,那么

Decorator类可以是ConcreteComponent的一个子类。同样道理,如果只有一个ConcreteDecorator类,那么就没有必要建立一个单独的Decorator类,而可以把DecoratorConcreteDecorator的责任合并成一个类。

实例一:外出打扮

Ø  抽象类 -- 文件Decorator.java

package com.yilong.decorator;

public abstract class Decorator {

    public abstract void show();

}

Ø  装扮对象Person -- 文件Person.java – 最基本(起初)的装扮对象

package com.yilong.decorator;

public class Person extends Decorator {

    private String name;

    public Person(String name) {

       this.name = name;

    }

    public void show() {

       System.out.println(this.name + " - 装扮成功!");

    }

}

Ø  抽象类PersonDecorator – PersonDecorator.java – 各种装扮的抽象

package com.yilong.decorator;

public abstract class PersonDecorator extends Decorator {

    Decorator decorator;

    public PersonDecorator(Decorator decorator) {

       this.decorator = decorator;

    }

    public abstract void show();

}

Ø  文件BigTrouserDisplay.java -- 添加垮裤的装扮

package com.yilong.decorator;

public class BigTrouserDisplay extends PersonDecorator {

    public BigTrouserDisplay(Decorator decorator) {

       super(decorator);

    }

    @Override

    public void show() {

       System.out.println("穿上 垮裤");

       this.decorator.show();

    }

}

Ø  文件TShirtDisplay.java – 添加”T-Shirt”的装扮

package com.yilong.decorator;

public class TShirtDisplay extends PersonDecorator {

    public TShirtDisplay(Decorator decorator) {

       super(decorator);

    }

    @Override

    public void show() {

       System.out.println("穿上 T-Shirt");

       this.decorator.show();

    }

}

Ø  文件Main.java – 测试类

package com.yilong.decorator;

public class Main {

    public static void main(String[] args) {

       Decorator decorator = new TShirtDisplay

(new BigTrouserDisplay(new Person("逸龙")));

       decorator.show();

    }

}

打印结果:

穿上 T-Shirt

穿上 垮裤

逸龙 - 装扮成功!

说明:程序中完全可以实现先穿垮裤,再穿T-Shirt,只要改变顺序即可。

实例二:修饰字符串

Ø  文件Main.java

package com.yilong.decorator.string;

public class Main {

    public static void main(String[] args) {

       Display d1 = new StringDisplay("Hello World!");

        System.out.println("展示方式一:");

       d1.show();

       Display d2 = new SideBorder(d1, '#');

       System.out.println("展示方式二:");

       d2.show();

       Display d3 = new FullBorder(d2);

       System.out.println("展示方式三:");

       d3.show();

       Display d4 = new FullBorder(new SideBorder(d3, '*'));

       System.out.println("展示方式四:");

       d4.show();

    }

}

Ø  文件Display.java

package com.yilong.decorator.string;

public abstract class Display {

    public abstract int getColumns();

    public abstract int getRows();

    public abstract String getRowText(int row);

   

    public void show() {

       for(int

转载于:https://my.oschina.net/lovedreamland/blog/12994

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值