Java 设计模式学习--装饰器模型
2020-04-13 本文已影响0人
superHang
其实无论是代理模式还是装饰模式,本质上就是对原有对象增强的方式~
对象增强方式有下面几种方式
-
继 承
-
继承父类,子类扩展
-
装饰器模式
-
使用“包装”的方式来增强对象
-
代理模式
装饰器模式
就是动态拓展原有类的功能,加强原有类的功能,就比如手机,把手机当成一个类,原有的手机只能打电话,现在增强这个类的功能,可以看美女直播,玩游戏,买东西。。。就是增强了这个类的功能
设计狗的接口,以一只狗 狗蛋为例子
public interface Dog {
void eat();
}
实现狗的接口,很久很久以前有一只狗叫做狗蛋,就会吃吃吃 和找隔壁的花花。。这两种技能
public class WhildDog implements Dog {
@Override
public void eat() {
System.out.println("原来的狗蛋就会天天吃吃吃吃吃。。。。");
}
@Override
public void findWomenDo() {
System.out.println("原来的狗蛋就会天天吃吃吃吃吃,吃完找隔离的小母狗花花。。。然后 羞羞羞羞");
}
}
抽象类--装饰器
//抽象类 装饰器 实现接口
public abstract class DecorateDog implements Dog {
private Dog dog;
//构造函数 实现狗的接口
public DecorateDog(Dog dog){
this.dog=dog;
}
//实现狗吃东西接口
@Override
public void eat(){
dog.eat();
}
@Override
public void findWomenDo(){
dog.findWomenDo();
}
}
开始给狗蛋加技能了,先是看门的技能,继承装饰器的抽象类,然后添加看门技能的方法,吃完东西学会看门了狗蛋
//继承装饰器的抽象类
public class GuardHouse extends DecorateDog {
public GuardHouse(Dog dog) {
super(dog);
}
//拓展功能
public void biteBadPerson(){
System.out.println("后来的狗蛋学会了看门....");
}
@Override
public void eat(){
//调用父类的方法
super.eat();
//看门
biteBadPerson();
}
给狗蛋添加接飞碟的技能了,吃完东西,看门了,酒足饭饱之后玩飞碟啊,然后再去找花花 嘿嘿嘿
public class TaoHaoMaster extends DecorateDog {
public TaoHaoMaster(Dog dog) {
super(dog);
}
public void play(){
System.out.println("吃完饭的狗蛋学会了玩飞碟,吸引隔离的花花");
}
@Override
public void findWomenDo(){
play();
super.findWomenDo();
}
}
执行看看,狗蛋一天的生活,new GuardHouse(dog) 新增了看门技能,new TaoHaoMaster(dog) 新增了接飞碟的技能,这两种技能对狗蛋进行了装饰,让狗蛋更加高大上了
public static void main(String [] args){
Dog dog=new WhildDog();
dog=new GuardHouse(dog);
dog=new TaoHaoMaster(dog);
dog.eat();
dog.findWomenDo();
image.png
其实下面这样简写就行,跟你经常玩的IO流系不系很像,啊哈IO就是用的装饰器模式嘛
Dog dog=new TaoHaoMaster(new GuardHouse(new WhildDog()));
dog.eat();
dog.findWomenDo();
//上面这玩意跟玩IO流的时候是不是很像
InputStream inputStream=
new BufferedInputStream(new FileInputStream(new File("C://狗蛋.jpg")));