Java设计模式之三装饰者模式

三、装饰者模式:

  1. 用于动态的给一个对象添加额外的职责,增强功能:继承的方式会占用类的继承关键字,还有动态代理模式也可。
  2. 适用场景:
    a. 处理那些可以撤销的职责
    b. 在不影响其他对象的情况下动态添加职责
  3. 实现过程:
    a. 写一个装饰类,提供私有构造方法,并传入被装饰者
    b. 装饰者和被装饰者需要具有相同的方法,可以通过接口的方式。
    c. 在装饰者内部添加新的功能。
  4. 四个角色:
    a. 接口:统一被装饰者和装饰者方法
    b. 被装饰者:实现接口,需要被改造的类
    c. 抽象类装饰者:实现接口,定义统一的额外职责。
    d. 具体装饰者:继承抽象类,增加具体的额外职责。
  • 注:抽象类不是必须的。
  1. 代码实现:
    //定义一个接口使得他们具有相同的方法
    	public interface Animals{
    		public void eat();
    	}
    	//定义一个被装饰类
    	public class Man implements Animals{
    		public Man(){}
    		@Override
    		public void eat(){
    			System.out.println("吃");
    		}
    	}
    	//定义一个抽象装饰类
    	public abstract class Person implements Animals{
    		protected Animals animals;
    		public void setAnimals(Animals animals){
    			super();
    			this.animals=animals;
    		}
    		@Override
    		public void eat(){
    			animals.eat();
    		}
    		public abstract void sleep();
    		public void talk(){
    			System.out.println("说");
    		}
    	}
    	//定义一个具体的装饰类,并加入可以起飞的功能
    	public class SuperMan extends Person{
    		public SuperMan(){}
    		@Override
    		public void eat(){
    			System.out.println("超人吃");
    		}
    		@Override
    		public void sleep(){
    			System.out.println("超人睡");
    		}
    		@Override
    		public void talk(){
    			System.out.println("超人说");
    		}
    		public void fly(){
    			System.out.println("超人飞");
    		}
    	}
    

在I/O中的使用

  • java中的装饰者类和被装饰者类以及他们之间的关系(仅仅是InputStream的)
  • 只要继承了FilterInputStream的类就是装饰者类,可以用于包装其他流,装饰者类还可以对装饰者和类进行再次包装。
DataInputStream in=new DataInputStream(new BufferedInputStream(new  FileInputStream("D:Demo.java")));
  • 先用BufferedInputStream包装成缓冲流,在使用DataInputStream进一步包装。

  • 参考链接:
    https://www.cnblogs.com/panhouye/p/6120232.html
    https://www.cnblogs.com/chenxing818/p/4705919.html
    https://blog.youkuaiyun.com/u013309870/article/details/75735676

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值