装饰者设计模式,简单代码实现


/**装饰者模式
 *   装饰者模式就是使用被装饰类的一个子类的实例,在客户端将
 * 这个子类的实例交给装饰类。是集成的替代方案
 *   优点:使用装饰模式,可以提供比继承更灵活的扩展对象的功能,它可以动态的添加对象
 * 的功能,并且可以随意地组合这些功能。
 *   缺点:正因为可以随意组合,所以就可能出现一些不合理地逻辑
 */

//首先创建手机类接口
package july.star.decorate;
/**
 * Phone
 * 创建手机类接口
 * @author MoXingJian
 * @email 939697374@qq.com
 * @date 2016年12月11日 下午8:59:36
 * @version 1.0
 */
public interface Phone {
     //每个手机都有打电话的功能
     public void call();
}

//实现其接口
package july.star.decorate;
 /**
  * IPhone
  * @author MoXingJian
  * @email 939697374@qq.com
  * @date 2016年12月11日 下午9:01:17
  * @version 1.0
  */
public class IPhone implements Phone{
     @Override
     public void call() {
          System.out.println("手机可以打电话了!");
     }
}

//创建抽象的手机抽象类
package july.star.decorate;
/**
 * PhoneDecotate
 * 创建抽象的手机装饰类
 * @author MoXingJian
 * @email 939697374@qq.com
 * @date 2016年12月11日 下午9:03:29
 * @version 1.0
 */
public abstract class PhoneDecorate implements Phone{
     private Phone p;
     public PhoneDecorate(Phone p){
          this.p = p;
     }
     @Override
     public void call() {
          p.call();
     }
}


//给手机装饰彩铃功能
package july.star.decorate;
 /**
  * RingPhoneDecorate
  * 给手机装饰彩铃功能
  * @author MoXingJian
  * @email 939697374@qq.com
  * @date 2016年12月11日 下午9:26:02
  * @version 1.0
  */
public class RingPhoneDecorate extends PhoneDecorate{
     public RingPhoneDecorate(Phone p) {
          super(p);
     }
     
     @Override
     public void call() {
          System.out.println("手机可以听彩铃");
          super.call();
     }
}


//给手机添加播放视频功能
package july.star.decorate;
 /**
  * MusicPhoneDecorate
  * 给手机添加播放视频功能
  * @author MoXingJian
  * @email 939697374@qq.com
  * @date 2016年12月11日 下午9:29:04
  * @version 1.0
  */
public class PlayPhoneDecorate extends PhoneDecorate{
     public PlayPhoneDecorate(Phone p) {
          super(p);
     }
     
     @Override
     public void call() {
          super.call();
          System.out.println("手机可以播放视频了");
     }
}



//测试
package july.star.decorate;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Scanner;
/**
 * PhoneDemo
 * 装饰者模式
 *   装饰者模式就是使用被装饰类的一个子类的实例,在客户端将
 * 这个子类的实例交给装饰类。是集成的替代方案
 *   优点:使用装饰模式,可以提供比继承更灵活的扩展对象的功能,它可以动态的添加对象
 * 的功能,并且可以随意地组合这些功能。
 *   缺点:正因为可以随意组合,所以就可能出现一些不合理地逻辑
 * @author MoXingJian
 * @email 939697374@qq.com
 * @date 2016年12月11日 下午9:06:30
 * @version 1.0
 */
public class PhoneDemo {
     public static void main(String[] args) {
          Phone p = new IPhone();
          p.call();
          System.out.println("-----------------------");
          // 打电话前听彩铃
          // 给手机添加彩铃功能
          RingPhoneDecorate rpd = new RingPhoneDecorate(p);
          rpd.call();
          System.out.println("-----------------------");
          // 打完电话后看视频
          // 给手机添加播放视频
          PlayPhoneDecorate pd = new PlayPhoneDecorate(p);
          pd.call();
          System.out.println("-----------------------");
          // 打电话前听彩铃,打完电话后播放视频
          RingPhoneDecorate r = new RingPhoneDecorate(new PlayPhoneDecorate(p));
          r.call();
          System.out.println("-----------------------");
          // 类似的IO流也是装饰者模式设计
          InputStream is = System.in; // 字节流
          // 包装
          InputStreamReader isr = new InputStreamReader(is); // 字符流,单读取一个
          // 再包装
          BufferedReader bis = new BufferedReader(isr);
          // 可以用一行来表示
          // BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
          BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
          
          //又或者是控制台录入
          //Scanner sc = new Scanner(System.in);
     }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值