GoF--装饰者设计模式

顾名思义,装饰模式就是给一个对象增加一些新的功能,而且是动态的,要求装饰对象和被装饰对象实现同一个接口,装饰对象持有被装饰对象的实例。

装饰器模式的应用场景:

1、需要扩展一个类的功能。

2、动态的为一个对象增加功能,而且还能动态撤销。(继承不能做到这一点,继承的功能是静态的,不能动态增删。)

缺点:产生过多相似的对象,不易排错!

 

 

 

其中类的职责如下:
 
抽象构件角色(Project):给出一个接口,以规范准备接收附加责任的对象
具体构件角色(Employe):定义一个将要接收附加责任的类
装饰角色(Manager):持有一个构件对象的实例,并定义一个与抽象构件接口一致的接口
具体装饰角色(ManagerA、ManagerB):负责给构件对象“贴上”附加的责任
 
二、装饰模式的使用
  Interface : Project
package edu.gof.decorator;

//抽象构件角色(Project):给出一个接口,以规范准备接收附加责任的对象
public interface Project {

//    编写代码
    void doCoding();
}

  Class : Employe

package edu.gof.decorator;

//具体构件角色(Employe):定义一个将要接收附加责任的类
public class Employe implements Project {

//    真正的编码工作
    public void doCoding() {
        System.out.println("码农:佛祖保佑,没有BUG");
    }

}

  Class : Manager

package edu.gof.decorator;

//装饰角色(Manager):持有一个构件对象的实例,并定义一个与抽象构件接口一致的接口
public class Manager implements Project {

    // 实际上存放的是代码工人对象
    private Project project;

    public Manager() {
        super();
    }

    public Manager(Project project) {
        super();
        this.project = project;
    }

    // 编码,总揽大局。装饰编码过程。
    public void doCoding() {
        // 项目经理开始新的项目
        this.startNewWork();
    }

    // 模板:定义项目经理自己的事情
    public void startNewWork() {
        // 项目经理在做早期工作
        this.doEarlyWork();
        // 早期工作完成,交由码农开始真正的编码工作
        this.project.doCoding();
        // 项目经理在做收尾工作
        this.doEndWork();
    }

//    项目经理的早期工作
    public void doEndWork() {

    }

//    项目经理的收尾工作
    public void doEarlyWork() {

    }

}

  Class : ManagerA

package edu.gof.decorator;

public class ManagerA extends Manager {

    public ManagerA() {
        super();
    }

    public ManagerA(Project project) {
        super(project);
    }
    
    public void doEarlyWork(){
        System.out.println("项目经理A 在做需求分析");
        System.out.println("项目经理A 在做架构设计");
        System.out.println("项目经理A 在做详细设计");
    }
    
}

  Class : ManagerB

package edu.gof.decorator;

public class ManagerB extends Manager {

    public ManagerB() {
        super();
    }

    public ManagerB(Project project) {
        super(project);
    }

    public void doEarlyWork(){
        System.out.println("项目经理B 在做需求分析");
        System.out.println("项目经理B 在做架构设计");
    }
    
    public void doEndWork(){
        System.out.println("项目经理B 在做收尾工作");
    }
    
}

  Class : DecoratorTest

package edu.gof.decorator;

public class DecoratorTest {

    public static void main(String[] args){
        Project ManagerA = new ManagerA(new Employe());
        ManagerA.doCoding();
        System.out.println("------------------------");
        Project ManagerB = new ManagerB(new Employe());
        ManagerB.doCoding();
    }
}

  Console :

项目经理A 在做需求分析
项目经理A 在做架构设计
项目经理A 在做详细设计
码农:佛祖保佑,没有BUG
------------------------
项目经理B 在做需求分析
项目经理B 在做架构设计
码农:佛祖保佑,没有BUG
项目经理B 在做收尾工作

啦啦啦

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值