• 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 在做收尾工作

    啦啦啦

  • 相关阅读:
    zookeeper笔记整理(二)
    zookeeper笔记整理(一)
    SpringBoot源码分析(三)整合MyBatis
    四、MyBatis终结篇(补充中...)
    三、SpringMVC终结篇(补充中...)
    二、SpringAOP终结篇(补充中...)
    一、SpringIOC终结篇(补充中...)
    跳出初学MySQL知识的原理整理(一)
    SpringBoot源码分析(二)启动原理
    一文带你学会基于SpringAop实现操作日志的记录
  • 原文地址:https://www.cnblogs.com/ClassNotFoundException/p/6293352.html
Copyright © 2020-2023  润新知