装饰器模式
复杂些的实例
在《绝地求生:刺激战场》游戏里面我们都知道。
Kar 98K有5发子弹;
装上弹匣后有10发子弹;
装上4倍镜后可以进行4倍瞄准;
装上8倍镜后可以进行4倍瞄准、8倍瞄准。
枪具有开火功能:
public interface Gun {
/** * 开火直至打空子弹 */
public void fire();
}
public class Kar98K implements Gun {
@Override
public void fire() {
System.out.println("砰*5");
}
}
装饰上弹匣变更枪开火功能:
public abstract class AbstractMagazine implements Gun {
private Gun gun;
public AbstractMagazine(Gun gun) {
this.gun = gun;
}
@Override
public void fire() {
gun.fire();
}
}
public class Magazine extends AbstractMagazine {
public Magazine(Gun gun) {
super(gun);
}
@Override
public void fire() {
System.out.println("砰*10");
}
}
测试:
public class Demo {
public static void main(String[] args) {
System.out.println("[捡起一把98K]");
Gun gun = new Kar98K();
System.out.println("[开炮!]");
gun.fire();
System.out.println("[装饰上弹匣]");
gun = new Magazine(gun);
System.out.println("[开炮!]");
gun.fire();
}
}
输出:
[捡起一把98K]
[开炮!]
砰*5
[装饰上弹匣]
[开炮!]
砰*10
现在我要装上4倍镜,使它具有4倍瞄准功能,这是枪支原本没有的功能。
扩展枪支接口功能:
public interface Aim4X extends Gun {
public void aim4X();
}
public abstract class AbstractTelescope4X implements Aim4X {
private Gun gun;
public AbstractTelescope4X(Gun gun) {
this.gun = gun;
}
@Override
public void fire() {
gun.fire();
}
}
public class Telescope4X extends AbstractTelescope4X {
public Telescope4X(Gun gun) {
super(gun);
}
@Override
public void aim4X() {
System.out.println("已进入4倍瞄准模式");
}
}
/** * 55式4倍镜 */
public class Telescope4X55 extends AbstractTelescope4X {
public Telescope4X55(Gun gun) {
super(gun);
}
@Override
public void aim4X() {
System.out.println("4倍超级瞄准已部署");
}
}
测试:
public class Demo {
public static void main(String[] args) {
System.out.println("[捡起一把98K]");
Gun gun = new Kar98K();
System.out.println("[装饰上4倍镜]");
Aim4X aim4X = new Telescope4X(gun);
System.out.println("[4倍瞄准]");
aim4X.aim4X();
System.out.println("[开炮!]");
aim4X.fire();
System.out.println("[先装饰上弹匣]");
gun = new Magazine(gun);
System.out.println("[再装饰上4倍镜]");
aim4X = new Telescope4X(gun);
System.out.println("[4倍瞄准]");
aim4X.aim4X();
System.out.println("[开炮!]");
aim4X.fire();
System.out.println("[人体描边?换上我的55式4倍镜]");
aim4X = new Telescope4X55(gun);
System.out.println("[4倍瞄准]");
aim4X.aim4X();
System.out.println("[开炮!]");
aim4X.fire();
}
}
输出:
[捡起一把98K]
[装饰上4倍镜]
[4倍瞄准]
已进入4倍瞄准模式
[开炮!]
砰*5
[先装饰上弹匣]
[再装饰上4倍镜]
[4倍瞄准]
已进入4倍瞄准模式
[开炮!]
砰*10
[人体描边?换上我的55式4倍镜]
[4倍瞄准]
4倍超级瞄准已部署
[开炮!]
砰*10
现在我要装上8倍镜,它具有4倍瞄准功能,也具有8倍瞄准功能。
扩展接口:
public interface Aim8X extends Aim4X {
public void aim8X();
}
public abstract class AbstractTelescope8X implements Aim8X {
private Gun gun;
public AbstractTelescope8X(Gun gun) {
this.gun = gun;
}
@Override
public void fire() {
gun.fire();
}
}
public class Telescope8X extends AbstractTelescope8X {
public Telescope8X(Gun gun) {
super(gun);
}
@Override
public void aim8X() {
System.out.println("进入8倍瞄准模式");
}
@Override
public void aim4X() {
System.out.println("进入4倍瞄准模式");
}
}
测试:
public class Demo {
public static void main(String[] args) {
System.out.println("[先装饰上弹匣]");
gun = new Magazine(gun);
System.out.println("[再装饰上8倍镜]");
aim8X = new Telescope8X(gun);
System.out.println("[8倍瞄准]");
aim8X.aim8X();
System.out.println("[敌人很近,换4倍]");
aim8X.aim4X();
System.out.println("[开炮!]");
aim8X.fire();
}
}
输出:
[先装饰上弹匣]
[再装饰上8倍镜]
[8倍瞄准]
进入8倍瞄准模式
[敌人很近,换4倍]
进入4倍瞄准模式
[开炮!]
砰*10这不是小明 这不是小明
xia***ng.chn@foxmail.com
6年前 (2019-02-20)