Java23种设计模式
装饰模式是不改变原来对象的基础上对原对象的拓展。
- 装饰模式修饰过的对象,本体不变,只对功能进行拓展。
- 一般来说,对象被多次装饰之后,只保留最后一次的装饰属性(否则不如用继承)。
需求:孙悟空七十二变,孙悟空本身是猴子,可以变成鸟和鱼。变身之后他拥有了鱼和鸟的属性,鱼和鸟的属性只是对猴属性的一种装饰,但是他本身依然是猴子而不是鱼或者鸟。
- 创建美猴王接口,里面有变化的方法。
public interface MonkeyKing {
void change();
}
- 创建猴子类,这个类是最基本的对象,因为孙悟空就是猴子。
public class Monkey implements MonkeyKing{
@Override
public void change() {
System.out.print("本体是猴子!\n");
}
}
- 创建装饰类鸟和鱼,里面一方面保持了猴子原本的属性,另一方面拥有鸟和鱼特有的属性。
public class Bird implements MonkeyKing{
private MonkeyKing monkeyKing;
public Bird(MonkeyKing monkeyKing) {
this.monkeyKing = monkeyKing;
}
@Override
public void change() {
monkeyKing.change();
System.out.print("变成一只小小鸟!\n");
}
public void fly(){
System.out.print("可以飞翔了!\n");
}
}
public class Fish implements MonkeyKing{
private MonkeyKing monkeyKing;
public Fish(MonkeyKing monkeyKing) {
this.monkeyKing = monkeyKing;
}
@Override
public void change() {
monkeyKing.change();
System.out.print("变成一只小鱼!\n");
}
public void swim(){
System.out.print("可以游泳了!\n");
}
}
- 创建test测试类,让孙悟空分别变化鸟和鱼,然后看本事的变化。
public class Test {
public static void main(String[] args) {
Monkey monkey = new Monkey();
Bird bird = new Bird(monkey);
Fish fish = new Fish(bird);
System.out.print("============\n变猴子!\n");
monkey.change();
System.out.print("============\n变傻鸟!\n");
bird.change();
bird.fly();
System.out.print("============\n变鲸鱼!\n");
fish.change();
fish.swim();
}
}
打印结果
============
变猴子!
本体是猴子!
============
变傻鸟!
本体是猴子!
变成一只小小鸟!
可以飞翔了!
============
变鲸鱼!
本体是猴子!
变成一只小小鸟!
变成一只小鱼!
可以游泳了!