码迷,mamicode.com
首页 > 其他好文 > 详细

设计模式之:装饰设计模式

时间:2016-05-12 20:26:47      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:

 

装饰设计模式

装饰设计模式概述

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

优点

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

缺点

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

 

装饰设计模式图解:

技术分享

例子1:

public interfacePhone {

   public abstract void call();

}

 

public classIPhone implementsPhone {

 

   @Override

   public void call() {

      System.out.println("手机可以打电话了");

   }

 

}

 

public abstractclassPhoneDecorate implements Phone {

 

   private Phone p;

 

   public PhoneDecorate(Phone p){

      this.p = p;

   }

 

   @Override

   public void call() {

      this.p.call();

   }

}

 

public classMusicPhoneDecorate extends PhoneDecorate {

 

   publicMusicPhoneDecorate(Phone p) {

      super(p);

   }

 

   @Override

   public void call() {

      super.call();

      System.out.println("手机可以听音乐");

   }

}

 

public classRingPhoneDecorate extends PhoneDecorate {

 

   public RingPhoneDecorate(Phonep) {

      super(p);

   }

 

   @Override

   public void call() {

      System.out.println("手机可以听彩铃");

      super.call();

   }

}

 

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.InputStreamReader;

import java.io.OutputStreamWriter;

import java.util.Scanner;

 

public class PhoneDemo {

         publicstatic void main(String[] args) {

                   Phonep = new IPhone();

                   p.call();

                   System.out.println("------------");

 

                   //需求:我想在接电话前,听彩铃

                   PhoneDecoratepd = new RingPhoneDecorate(p);

                   pd.call();

                   System.out.println("------------");

 

                   //需求:我想在接电话后,听音乐

                   pd= new MusicPhoneDecorate(p);

                   pd.call();

                   System.out.println("------------");

 

                   //需求:我要想手机在接前听彩铃,接后听音乐

                   //自己提供装饰类,在打电话前听彩铃,打电话后听音乐

                   pd= new RingPhoneDecorate(newMusicPhoneDecorate(p));

                   pd.call();

                   System.out.println("----------");

                   //想想我们在IO流中的使用

                   //InputStream is = System.in;

                   //InputStreamReader isr = new InputStreamReader(is);

                   //BufferedReader br = new BufferedReader(isr);

                   BufferedReaderbr = new BufferedReader(newInputStreamReader(System.in));

                   BufferedWriterbw = new BufferedWriter((new OutputStreamWriter(

                                     System.out)));

 

                   Scannersc = new Scanner(System.in);

         }

}

运行结果:

手机可以打电话了

------------

手机可以听彩铃

手机可以打电话了

------------

手机可以打电话了

手机可以听音乐

------------

手机可以听彩铃

手机可以打电话了

手机可以听音乐

----------

 

 

设计模式之:装饰设计模式

标签:

原文地址:http://blog.csdn.net/wangyanming123/article/details/51355985

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!