设计模式-装饰模式

这次主要记录下装饰模式的学习过程


一、什么是装饰模式

  • 装饰模式(Strategy Pattern):动态地给一个对象添加一些额外的职责
  • 优点:
    • 将类中的装饰功能从类中移除,从而简化原有的类
    • 有效地把类的核心职责和装饰功能区分开来,去除相关类中重复的装饰逻辑
    • 与继承相比,具有更多的灵活性,可以动态地扩展一个类的功能
  • 缺点:
    • 多层装饰,会导致程序变得复杂
  • 特点:
    • 装饰对象和被装饰对象具有相同的接口
    • 装饰对象中包含一个被装饰对象的引用
    • 装饰对象接受所有来自客户端的请求,将其转发给被装饰对象
    • 装饰对象可以在转发请求的前后增加一些附加功能

二、装饰模式UML图

在这里插入图片描述


三、装饰模式示例

Building.java
需要被装饰的基类,定义了一个对象接口,可以给这些对象动态地添加职责

/**
 * @Title: Building.java
 * @Description: 需要被装饰的基类
 * @Author: xj
 * @Date: 2018/9/3 22:37
 */
public abstract class Building {

    public abstract void show();
}

House.java
需要被装饰的具体类,定义了一个具体的对象,可以给这个对象动态地添加职责

/**
 * @Title: House.java
 * @Description:  需要被装饰的具体类
 * @Author: xj
 * @Date: 2018/9/3 22:22
 */
public class House extends Building {

    @Override
    public void show() {
        System.out.println("房子现在空空如也");
    }
}

Decorator.java
装饰基类,从外类来扩展Building类的功能,但对于Building类来说,无需知道Decorator类的存在

/**
 * @Title: Decorator.java
 * @Description: 装饰基类
 * @Author: xj
 * @Date: 2018/9/3 22:35
 */
public abstract class Decorator extends Building {

    private Building building;

    public void setBuilding(Building building) {
        this.building = building;
    }

    @Override
    public void show() {
        if (null != building) {
            building.show();
        }
    }
}

Bed.java
装饰具体类,具体的装饰对象,起到给Building类添加职责的功能

/**
 * @Title: Bed.java
 * @Description: 装饰具体类
 * @Author: xj
 * @Date: 2018/9/3 22:48
 */
public class Bed extends Decorator {

    /**
     * 本类独有的功能
     */
    private String bed;

    @Override
    public void show() {
        // 先执行父类方法,再执行本类方法
        super.show();
        bed = "往房子里添加床";
        System.out.println(bed);
    }
}

Chair.java
装饰具体类,具体的装饰对象,起到给Building类添加职责的功能

/**
 * @Title: Chair.java
 * @Description: 装饰具体类
 * @Author: xj
 * @Date: 2018/9/3 22:52
 */
public class Chair extends Decorator {

    /**
     * 本类独有的功能
     */
    private String chair;

    @Override
    public void show() {
        // 先执行父类方法,再执行本类方法
        super.show();
        chair = "往房子里添加椅子";
        System.out.println(chair);
    }
}

Sofa.java
装饰具体类,具体的装饰对象,起到给Building类添加职责的功能

/**
 * @Title: Sofa.java
 * @Description: 装饰具体类
 * @Author: xj
 * @Date: 2018/9/3 22:43
 */
public class Sofa extends Decorator {

    /**
     * 本类独有的功能
     */
    private String sofa;

    @Override
    public void show() {
        // 先执行父类方法,再执行本类方法
        super.show();
        sofa = "往房子里添加沙发";
        System.out.println(sofa);
    }
}

Table.java
装饰具体类,具体的装饰对象,起到给Building类添加职责的功能

/**
 * @Title: Table.java
 * @Description: 装饰具体类
 * @Author: xj
 * @Date: 2018/9/3 22:50
 */
public class Table extends Decorator {

    /**
     * 本类独有的功能
     */
    private String table;

    @Override
    public void show() {
        // 先执行父类方法,再执行本类方法
        super.show();
        table = "往房子里添加桌子";
        System.out.println(table);
    }
}

Test.java
测试类

/**
 * @Title: Test.java
 * @Description: 测试类
 * @Author: xj
 * @Date: 2018/9/3 22:53
 */
public class Test {

    public static void main(String[] args) {
        Building house = new House();

        System.out.println("第一种装修");
        Decorator bed = new Bed();
        Decorator sofa = new Sofa();
        bed.setBuilding(house);
        sofa.setBuilding(bed);
        sofa.show();
        System.out.println("装修结束...");

        System.out.println("=================================");

        System.out.println("第二种装修");
        Decorator table = new Table();
        Decorator chair = new Chair();
        table.setBuilding(house);
        chair.setBuilding(table);
        chair.show();
        System.out.println("装修结束...");
    }
}

输出结果
在这里插入图片描述


以上就是装饰模式的一个小例子

posted @ 2018-09-25 23:28  GeneXu  阅读(57)  评论(0)    收藏  举报