zoukankan      html  css  js  c++  java
  • java 28

    装饰设计模式

      装饰设计模式概述

      装饰模式就是使用被装饰类的一个子类的实例,在客户端将这个子类的实例交给装饰类。是继承的替代方案

      优点

      使用装饰模式,可以提供比继承更灵活的扩展对象的功能,它可以动态的添加对象的功能,并且可以随意的组合这些功能

      缺点

      正因为可以随意组合,所以就可能出现一些不合理的逻辑

    装饰设计模式,就是继承的替代方案。

    例子:

      手机的例子:(装饰设计模式)

    现在用个电脑类来写代码例子:

      

      1、现在有个电脑的规则接口:

     1 /**
     2  * 这是电脑类的规则接口
     3  * 
     4  * @author LZL
     5  * 
     6  */
     7 public interface Computer {
     8     // 电脑用来办公
     9     public void office();
    10 }

      2、制作了一台ThinkPad电脑:(实现电脑规则接口的实现类)

     1 /**
     2  * 
     3  * 实现了电脑规则的接口
     4  * 
     5  * @author LZL
     6  * 
     7  */
     8 
     9 public class ThinkPad implements Computer {
    10 
    11     public void office() {
    12         System.out.println("ThinkPad可以办公");
    13     }
    14 
    15 }

      3、我想用这台电脑在办公后编程,那么我就需要一个总的装饰类,以及一个编程的装饰类

      总的装饰类:(由于是对电脑进行装饰,所以要实现电脑规则的接口)

     1 /**
     2  * 这是对电脑进行装饰的装饰类
     3  * 
     4  * @author LZL
     5  * 
     6  */
     7 public class CPDecorate implements Computer {
     8 
     9     // 接收一个电脑类
    10     private Computer cp;
    11 
    12     public CPDecorate(Computer cp) {
    13         this.cp = cp;
    14     }
    15 
    16     // 实现电脑类的方法
    17     public void office() {
    18         this.cp.office();
    19     }
    20 
    21 }

      编程的装饰类:(对电脑增加编程功能的装饰类,得继承电脑的装饰类来实现)

     1 /**
     2  * 这是对电脑增加编程功能的装饰类,得继承电脑的装饰类来实现
     3  * 
     4  * @author LZL
     5  * 
     6  */
     7 
     8 public class ProGramme extends CPDecorate {
     9 
    10     public ProGramme(Computer cp) {
    11         super(cp);
    12     }
    13 
    14     // 调用电脑的办公功能
    15     public void office() {
    16 
    17         super.office();
    18         System.out.println("还可以编程");
    19     }
    20 
    21 }

      同理,我想要在办公前听下音乐,就要一个音乐的装饰类:

     1 public class Music extends CPDecorate {
     2 
     3     public Music(Computer cp) {
     4         super(cp);
     5     }
     6 
     7     public void office() {
     8         System.out.println("听音乐");
     9         super.office();
    10     }
    11 }

      最后,我运行这台电脑:

     1 public class ComputerDemo {
     2 
     3     public static void main(String[] args) {
     4 
     5         // 创建电脑对象
     6         Computer cp = new ThinkPad();
     7         cp.office();
     8         System.out.println("--------");
     9 
    10         // 我要办公后来编程,那么就需要一个装饰类来实现
    11         // 创建装饰后的电脑对象
    12         CPDecorate cpd = new ProGramme(cp);
    13         cpd.office();
    14         System.out.println("------");
    15 
    16         // 我想在办公前听音乐,再来个装饰类
    17         cpd = new Music(cp);
    18         cpd.office();
    19         System.out.println("------");
    20         
    21         // 我想在办公前听音乐,办公后编程
    22         cpd = new Music(new ProGramme(cp));
    23         cpd.office();
    24     }
    25 
    26 }

      其实,我们之前在IO流就已经用过了装饰设计模式。

    理解下面:

    比如:

      输入字节流转换成输入字符流:(一次性只能读取一个字节  →  一次性可以读取一个字符)

    InputStreamReader isr = new InputStreamReader(is);

      然后再转换成高效输入字符流:(一次性只能读取一个字符   →  一次性可以读取一行字符)

    BufferedReader br = new BufferedReader(isr);

      上面两个合起来: 输入字节流转换成高校输入字符流(一次性只能读取一个字节  →   一次性可以读取一行字符)

    1 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

      还有,输出字节流转换成高效输出字符流

    1 BufferedWriter bw = new BufferedWriter((newOutputStreamWriter(
    2                 System.out)));
  • 相关阅读:
    NHibernate连接Oracle配置问题
    事件之 textField
    加入了有生命力的团队
    亲临 Adobe CS4 新产品发布会
    flash打开exe程序
    Lite:AMC MMI
    Lite:SharedObject对象保存数据 到Pc 或手机
    忙忙碌碌
    as3.0过渡完毕,用as3 做了几个Air程序
    getURL("mailTo:wangnai789@sina.com")给多人发送邮件
  • 原文地址:https://www.cnblogs.com/LZL-student/p/5970608.html
Copyright © 2011-2022 走看看