zoukankan      html  css  js  c++  java
  • java装饰器模式

    意图:动态的将责任附加到对象上
    什么时候使用:
    1.在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责
    2.处理那些可以撤销的职责
    3.当不能采用生成子类的方式进行扩充时
    结构图:

    示例代码:

    1 package com.test.patten.decorator;
    2 
    3 public interface Person {
    4     void doCoding();
    5 }
     1 package com.test.patten.decorator;
     2 
     3 public class Employee implements Person {
     4 
     5     @Override
     6     public void doCoding() {
     7         System.out.println("程序员加班写程序啊,写程序,终于写完了。。。");
     8     }
     9 
    10 }
    1 package com.test.patten.decorator;
    2 
    3 public abstract class Manager implements Person{
    4     
    5     //装饰器增加功能
    6     public abstract void doCoding();
    7 
    8 }
     1 package com.test.patten.decorator;
     2 
     3 public class ManagerA extends Manager {
     4     private Person person;//给雇员升职
     5     
     6     public ManagerA(Person person) {
     7         super();
     8         this.person = person;
     9     }
    10     @Override
    11     public void doCoding() {
    12         doEarlyWork();
    13         person.doCoding();        
    14     }
    15     /**
    16      * 项目经理开始前期准备工作
    17      */
    18     public void doEarlyWork() {
    19         System.out.println("项目经理A做需求分析");
    20         System.out.println("项目经理A做架构设计");
    21         System.out.println("项目经理A做详细设计"); 
    22     }
    23 }
     1 package com.test.patten.decorator;
     2 
     3 public class ManagerB extends Manager {
     4     private Person person;//给雇员升职
     5     
     6     public ManagerB(Person person) {
     7         super();
     8         this.person = person;
     9     }
    10     @Override
    11     public void doCoding() {
    12         person.doCoding();
    13         doEndWork();
    14     }
    15     /**
    16      * 项目经理开始项目收尾工作
    17      */
    18     public void doEndWork() {
    19         System.out.println("项目经理B 在做收尾工作");
    20     }
    21     
    22 }

    测试一下:

     1 package com.test.patten.decorator;
     2 
     3 public class Client {
     4     public static void main(String args[]){
     5         Person employee = new Employee();
     6         employee = new ManagerA(employee);//赋予程序猿项目经理A职责
     7         employee = new ManagerB(employee);//赋予程序猿项目经理B职责
     8         
     9         employee.doCoding();
    10     }
    11 }
    项目经理A做需求分析
    项目经理A做架构设计
    项目经理A做详细设计
    程序员加班写程序啊,写程序,终于写完了。。。
    项目经理B 在做收尾工作
    

     实际应用中的例子:java i/o

    应用到的设计原则:对扩展开放,对修改关闭

    优缺点:

    1.装饰者类反应出被装饰的组件类型

    2.装饰者类可以在被装饰者的行为前面或后面加上自己的行为,甚至取代被装饰者的行为,达到特定的目的

    3.可以用无数个装饰者包装一个组件,装饰者类会导致设计中出现许多小对象,过度使用会让程序变的复杂

    4.装饰者一般对组件的客户是透明的,除非客户程序依赖于组件的具体类型

  • 相关阅读:
    [AWS] Lab
    [AWS] Lab
    [AWS] Launch the VPC Wizard
    [AWS] EC2 Dashboard
    mysql .net下载
    币乎咕噜DeFi踩雷记
    量化分析师关于有限差分方法(FDM)最好的5本书
    QuantStart量化交易文集
    Exploring Market Making Strategy for High Frequency Trading: An Agent-Based Approach
    什么是信息比率?信息比率与夏普比率的差别?
  • 原文地址:https://www.cnblogs.com/ikuman/p/2877913.html
Copyright © 2011-2022 走看看