• 设计模式之适配器模式(Decorator)


    1.意图

    动态地给一个对象添加一些额外的功能.

    2.适用性

    • 动态、透明的方式给单个对象添加职责。
    • 如果不适合适用子类来进行扩展的时候,可以考虑适用装饰模式。
    • 避免子类数目爆炸性增长。

    3.结构

    4.参与者

    • Component: 定义一个对象接口,可以给这些对象动态地添加职责.
    • ConcreteComponent: 定义一个对象,可以给这个对象添加职责.
    • Decorator: 持有一个指向Component对象的引用,并定义一个与Component的接口一致的接口.
    • ConcreteComponent: 向组件添加职责.

    5.效果

    1) 优点:

    • 比静态继承更灵活.
    • 避免在层次结果高层的类有太多的特征.

    2) 缺点:

    • 产生许多小对象,增加对象复杂度,,不易排错.

    6.模式应用

    • Java中的I/O流
    • 面向切面编程AOP(思想相似)

    7.实例

    1) 场景

    一个软件公司由员工Employee组成,员工又分为开发人员Dev、领导Leader、经理Manager、QA部门领导QALeader。Dev职责是开发代码;QALeader职责不但能开发代码,而且能设计测试案例,写测试报告;Manager职责还能开发框架,发布版本。

    2)UML图

    3)代码

    Employee

    1. public abstract class Employee {
    2. public abstract void doSomething();
    3. }

    Dev

    1. public class Dev extends Employee {
    2. @Override
    3. public void doSomething() {
    4. // TODO Auto-generated method stub
    5. writeCode();
    6. }
    7. private void writeCode() {
    8. // TODO Auto-generated method stub
    9. System.out.println("I'm a programer,complete the code!");
    10. System.out.println("---------------------------------------");
    11. }
    12. }

    Leader

    1. public abstract class Leader extends Employee {
    2. private Employee person;
    3. public Leader(Employee person) {
    4. super();
    5. this.person = person;
    6. }
    7. @Override
    8. public void doSomething() {
    9. person.doSomething();
    10. }
    11. }

    Manager

    1. public class Manager extends Leader {
    2. public Manager(Employee person) {
    3. super(person);
    4. // TODO Auto-generated constructor stub
    5. }
    6. public void doSomething(){
    7. begin();
    8. super.doSomething();
    9. end();
    10. }
    11. private void begin() {
    12. // TODO Auto-generated method stub
    13. System.out.println("Design the framework!");
    14. System.out.println("---------------------------------------");
    15. }
    16. private void end() {
    17. // TODO Auto-generated method stub
    18. System.out.println("Release the verion!");
    19. System.out.println("---------------------------------------");
    20. }
    21. }

    QALeader

    1. public class QALeader extends Leader {
    2. public QALeader(Employee person){
    3. super(person);
    4. }
    5. @Override
    6. public void doSomething() {
    7. // TODO Auto-generated method stub
    8. begin();
    9. super.doSomething();
    10. end();
    11. }
    12. private void end() {
    13. // TODO Auto-generated method stub
    14. System.out.println("Write the test reporter");
    15. System.out.println("---------------------------------------");
    16. }
    17. private void begin() {
    18. // TODO Auto-generated method stub
    19. System.out.println("Write the test cases!");
    20. System.out.println("---------------------------------------");
    21. }
    22. }

    输出结果:
    ========leader1 doSomething==========
    Write the test cases!
    ---------------------------------------
    I'm a programer,complete the code!
    ---------------------------------------
    Write the test reporter
    ---------------------------------------
    ========leader2 doSomething==========
    Design the framework!
    ---------------------------------------
    Write the test cases!
    ---------------------------------------
    I'm a programer,complete the code!
    ---------------------------------------
    Write the test reporter
    ---------------------------------------
    Release the verion!
    ---------------------------------------





  • 相关阅读:
    项目游戏开发日记 No.0x000002
    项目游戏开发日记 No.0x000001
    项目游戏开发日记 No.0x00000
    需求获取常见的方法是进行客户访谈,结合你的实践谈谈会遇到什么问题,你是怎么解决的?
    当下大部分互联网创业公司为什么都愿意采用增量模型来做开发?
    迷茫踌躇的2018,整装待发的2019
    阿里云轻量应用服务器 搭建配置详解
    JS常用数组方法及实例
    使用CSS隐藏HTML元素的四种常用方法
    标签种类及CSS引入方法
  • 原文地址:https://www.cnblogs.com/csu_xajy/p/4314310.html
Copyright © 2020-2023  润新知