博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【设计模式】—-(8)装饰模式(结构型)
阅读量:4101 次
发布时间:2019-05-25

本文共 2177 字,大约阅读时间需要 7 分钟。

意图:动态的将责任附加到对象上
什么时候使用:
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     @Override11     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     @Override11     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.装饰者一般对组件的客户是透明的,除非客户程序依赖于组件的具体类型

转载地址:http://neusi.baihongyu.com/

你可能感兴趣的文章
通过Maven管理项目依赖
查看>>
通过Spring Boot三分钟创建Spring Web项目
查看>>
Spring的IoC(依赖注入)原理
查看>>
Java编程基础:static的用法
查看>>
Java编程基础:抽象类和接口
查看>>
Java编程基础:异常处理
查看>>
Spring MVC中使用Thymeleaf模板引擎
查看>>
Spring处理表单提交
查看>>
Spring MVC异常处理
查看>>
Leetcode 1180. Count Substrings with Only One Distinct Letter [Python]
查看>>
PHP 7 的五大新特性
查看>>
php实现socket(转)
查看>>
PHP底层的运行机制与原理
查看>>
深入了解php底层机制
查看>>
PHP中的stdClass 【转】
查看>>
XHProf-php轻量级的性能分析工具
查看>>
PHP7新特性 What will be in PHP 7/PHPNG
查看>>
比较strtr, str_replace和preg_replace三个函数的效率
查看>>
ubuntu 下编译PHP5.5.7问题:configure: error: freetype.h not found.
查看>>
PHP编译configure时常见错误 debian centos
查看>>