目录
2【策略模式应用场景举例】 5
3【代理模式应用场景举例】 8
4【外观模式应用场景举例】 12
5【抽象工厂模式应用场景举例】 14
6【观察者模式应用场景举例】 22
7【建造者模式应用场景举例】 27
8【原型模式应用场景举例】 32
9【工厂方法模式应用场景举例】 36
10【模板方法模式应用场景举例】 40
1【装饰模式应用场景举例】
比如在玩“极品飞车”这款游戏,游戏中有对汽车进行喷涂鸦的功能,而且这个喷涂鸦是可以覆盖的,并且覆盖的顺序也影响到最后车身的显示效果,假设现在喷涂鸦具有2种样式:(1)红火焰 (2)紫霞光如果使用“继承父类”设计这样的功能,那么类图就像如下的这样:
从图中可以看到使用继承来实现这种功能,并且是2种涂鸦样式,就需要创建4个子类,
如果喷涂鸦有3种,4种呢?这种情况就是典型中学课程学习过的“排列与组合”,那简直就是“Head First设计模式”书中讲的“类爆炸”。
显然继承“奥迪汽车类”的这个办法是无效,而且是非常徒劳,繁琐的。
那么如何才能以“灵活”,“顺序敏感”这样的需求来实现这样的功能呢?
【装饰模式解释】
类型:结构模式
动态的对一个对象进行功能上的扩展,也可以对其子类进行功能上的扩展。
【装饰模式UML图】
【装饰模式-JAVA代码实现】
新建一个抽象汽车父类:
package car_package; public abstract class car_parent { // 汽车抽象父类 private String make_address; private int speed; public String getMake_address() { return make_address; } public void setMake_address(String make_address) { this.make_address = make_address; } public int getSpeed() { return speed; } public void setSpeed(int speed) { this.speed = speed; } public abstract void print_face(); } |
然后新建一个奥迪汽车子类
package car_package; public class audi_sub extends car_parent { // 奥迪汽车子类 @Override public void print_face() { System.out.println("audi车默认的颜为 黑"); } } |
然后再新建一个装饰者父类:
package decorator_package; import car_package.car_parent; public abstract class decorator_parent extends car_parent { // 装饰者父类 protected car_parent car_parent_ref; public void setCar_parent_ref(car_parent car_parent_ref) { this.car_parent_ref = car_parent_ref; } @Override黄海大柴神 public void print_face() { car_parent_ref.print_face(); } } |
然后再新建装饰者子类:红火焰装饰者类:
package decorator_package; public class decorator_audi_red extends decorator_parent { @Override public void print_face() { super.print_face(); System.out.println("给 奥迪 喷涂鸦 - 颜为 红火焰"); } } |
然后再新建装饰者子类:紫霞光装饰者类:
package decorator_package; public class decorator_audi_purple extends decorator_parent { @Override public void print_face() { super.print_face(); System.out.println("给 奥迪 喷涂鸦 - 颜为 紫霞光"); } } |
新建一个运行类
package main_run; import car_package.audi_sub; import decorator_package.decorator_audi_purple; import decorator_package.decorator_audi_red; public class main_run { public static void main(String[] args) { audi_sub audi_sub_ref = new audi_sub(); audi_sub_ref.setMake_address("北京市朝阳区"); audi_sub_ref.setSpeed(200); decorator_audi_red decorator_audi_red_ref = new decorator_audi_red(); decorator_audi_red_ref.setCar_parent_ref(audi_sub_ref); 电瓶车电瓶价格 decorator_audi_purple decorator_audi_purple_ref = new decorator_audi_purple(); decorator_audi_purple_ref.setCar_parent_ref(decorator_audi_red_ref); decorator_audi_purple_ref.print_face(); } } |
程序运行结果如下:
audi车默认的颜为 黑 给 奥迪 喷涂鸦 - 颜为 红火焰 给 奥迪 喷涂鸦 - 颜为 紫霞光 |
从程序结构中可以看到,完全符合了前面我们的要求:“灵活”,“顺序敏感”。
2【策略模式应用场景举例】
比如在玩“极品飞车”这款游戏,那么游戏对车的轮胎是可以更换的,不同的轮胎在高速转弯时有不同的痕迹样式,那么针对“汽车”的配件“轮胎”就要可以变化,而且轮胎和轮胎之间是可以相互替换的,这就是典型的要应用“策略模式”的场景!从程序结构中可以看到,完全符合了前面我们的要求:“灵活”,“顺序敏感”。
【策略模式解释】
类型:行为模式
定义一组算法,将每个算法都封装起来,并且使它们之间可以互换。策略模式使这些算法在客户端调用它们的时候能够互不影响地变化。
【策略模式UML图】
【策略模式-JAVA代码实现】
从策略模式UML图中可以看到Context与接口Strategy是组合关系,即强引用关系。
新建一个轮胎接口:
package strategy_interface; public interface tyre_interface { // tyre 轮胎 public void print_tyre_line();// 显示出轮胎的痕迹 } |
新建2个轮胎接口的实现类:
package strategy_implement; import _interface; //长痕迹轮胎类 public class tyre_long_implement implements tyre_interface { public void print_tyre_line() { System.out.println("在路面上显示一个长轮胎痕迹"); } } |
package strategy_implement; import _interface; 奔驰s600v12报价//短痕迹轮胎类 public class tyre_short_implement implements tyre_interface { public void print_tyre_line() { System.out.println("在路面上显示一个短轮胎痕迹"); } } |
基于一个轮胎接口来实现不同样式的轮胎样式。
组装一个Car车类:
package car_package; import最新中型suv质量排名出炉 _interface; public class Car { private String make_address;// 制造地 private int death_year;// 报废年限 private int speed;// 速度 private tyre_interface tyre_interface_ref;// 轮胎的样式 public String getMake_address() { return make_address; } public void setMake_address(String make_address) { this.make_address = make_address; } public int getDeath_year() { return death_year; } public void setDeath_year(int death_year) { this.death_year = death_year; } public int getSpeed() { return speed; } public void setSpeed(int speed) { this.speed = speed; } public tyre_interface getTyre_interface_ref() { return tyre_interface_ref; } public void setTyre_interface_ref(tyre_interface tyre_interface_ref) { this.tyre_interface_ref = tyre_interface_ref; } public void start() { System.out.println("车的基本信息为:"); System.out.println("制造地make_address:" + this.getMake_address()); System.out.println("报废年限death_year:" + this.getDeath_year()); System.out.println("速度speed:" + this.getSpeed()); System.out.println("Car 起动了!"); System.out.println("Car高速行驶,遇到一个大转弯,路面显示:"); this.getTyre_interface_ref().print_tyre_line(); } } |
让车跑起来,并且具有更换轮胎样式的功能:
发布评论