设计模式之装饰模式

来源:互联网 发布:广州多想网络 骗 编辑:程序博客网 时间:2024/05/18 18:45

什么叫装饰模式?

我们知道,如果想对某个类进行功能扩充,一般就会想到使用继承(对拓展开放,对修改关闭的开闭原则)。如果我们不使用继承的话还有没有其他方式来实现呢?答案是有的:就是使用装饰模式;
装饰模式也叫做包装模式,结构型设计模式之一。可以用来动态透明的方式来拓展对象的功能。可以看做是继承关系的一种补充(替代)。

装饰模式的定义

动态的为一个对象添加一些额外的职责。就增加功能来说,装饰模式相比继承更为灵活

装饰模式的简单实现

  1. 首先创建一个用于被装饰的抽象类person

    public abstract class Person {//定义一个穿着的抽象方法public abstract void dressed();}
  2. 第二步创建被装饰的实体类boy,该类继承person,实现了其中的方法

    public class Boy extends Person {@Overridepublic void dressed() {    System.out.println("男孩穿了内裤");}}
  3. 创建装饰者的抽象类PersonCloth,该类继承Person类,保持一个person类的引用

    //抽象的装饰者,持有一个Person抽象类(基类)的引用public class PersonCloth extends Person {private Person mPerson;public PersonCloth(Person person) {    mPerson = person;}@Overridepublic void dressed() {    //调用Person的dressed方法    mPerson.dressed();}
  4. 接下来我们就可以创建实际的装饰者类了,显而易见,该类需要继承PersonCloth。我们创建两个装饰类:CheapCloth、ExpensiveCloth:

    • CheapCloth.java

      public class CheapCloth extends PersonCloth {public CheapCloth(Person person) {    super(person);}private void dressShirt() {    System.out.println("穿件便宜的短袖");}private void dressJean() {    System.out.println("穿着便宜的牛仔裤");}@Overridepublic void dressed() {//增强的dressed方法    super.dressed();    dressShirt();    dressJean();}
    • ExpensiveCloth.java

      public class ExpensiveCloth extends PersonCloth {public ExpensiveCloth(Person person) {    super(person);}private void dressShirt() {    System.out.println("穿件昂贵短袖");}private void dressJean() {    System.out.println("穿着昂贵的牛仔裤");}@Overridepublic void dressed() {//增强的dressed方法    super.dressed();    dressShirt();    dressJean();}

    上面的这两个类都继承了抽象类PersonColth类,从代码中我们可以看到,这两个类“丰富”了原来的dressed方法,实现了动态增加功能的预期。

  5. main函数调用

    public class MainTest {    public static void main(String[] args) {        Person person = new Boy();        //使用装饰者:穿上便宜的衣服        PersonCloth colthCheap = new CheapCloth(person);        colthCheap.dressed();        System.out.println("~~~~~~~~~~~~~~~~~~");        //使用装饰者:穿上昂贵的衣服        PersonCloth colthExpensive = new ExpensiveCloth(person);        colthExpensive.dressed();    }}

    以上代码很简单,我们直接看打印的结果:

    男孩穿了内裤
    穿件便宜的短袖
    穿着便宜的牛仔裤
    ~~~~~~~~~~~~~~
    男孩穿了内裤
    穿件昂贵短袖
    穿着昂贵的牛仔裤

总结

装饰模式并不复杂,其本质更像是一种对类的封装还有调用。装饰模式和代理模式很相似,但是却比代理模式稍微复杂点。装饰模式是以对客户端透明的方式扩充对象的功能,是继承关系的一种替代方案。并可以对所装饰的对象增强其功能;代理模式的核心是指给一个对象提供一个代理对象,并由代理对象控制对原有对象的引用,并不能增强原对象的功能。

原创粉丝点击