一、定义
将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。
二、角色
抽象化(Abstraction)角色:定义抽象类,并包含一个对实现化对象的引用。
扩展抽象化(Refined Abstraction)角色:是抽象化角色的子类,实现父类中的业务方法,并通过聚合关系调用实现化角色中的业务方法。
实现化(Implementor)角色:定义实现化角色的接口,供扩展抽象化角色调用。
具体实现化(Concrete Implementor)角色:给出实现化角色接口的具体实现。
三、场景

类图

- 抽象化(Abstraction)角色 通过聚合关系调用 实现化(Implementor)角色中的业务方法。(这里的UML类图画错了)
- 扩展抽象化(Refined Abstraction)角色:是抽象化角色的子类,实现父类中的业务方法,并通过聚合关系调用实现化(Implementor)角色中的业务方法。
代码
实现化(Implementor)角色;
定义实现化角色的接口,供扩展抽象化角色调用
public interface Brand {void start();void call();void stop();}
抽象化(Abstraction)角色
定义抽象手机.通过聚合的关系把两个不同的对象引入到一起
public abstract class Phone {// 通过聚合引入private Brand brand;public Phone(Brand brand){this.brand = brand;}// 调用实现化(Implementor)角色中的start方法方法public void start(){brand.start();}public void call(){brand.call();}public void stop(){brand.stop();}}
扩展抽象化(Refined Abstraction)角色
是抽象化角色的子类,实现父类中的业务方法,并通过聚合关系调用实现化(Implementor)角色中的业务方法
public class CurvedScreenPhone extends Phone{public CurvedScreenPhone(Brand brand) {super(brand);}@Overridepublic void start() {System.out.println("曲面屏手机");super.start();}@Overridepublic void call() {System.out.println("曲面屏手机");super.call();}@Overridepublic void stop() {System.out.println("曲面屏手机");super.stop();}}
水滴屏手机
public class WaterDropScreenPhone extends Phone{public WaterDropScreenPhone(Brand brand) {super(brand);}@Overridepublic void start() {System.out.println("水滴屏手机");super.start();}@Overridepublic void call() {System.out.println("水滴屏手机");super.call();}@Overridepublic void stop() {System.out.println("水滴屏手机");super.stop();}}
具体实现化(Concrete Implementor)角色
给出实现化角色接口的具体实现;
public class VIVOBrand implements Brand{@Overridepublic void start() {System.out.println("vivo 准备打电话");}@Overridepublic void call() {System.out.println("vivo 打电话");}@Overridepublic void stop() {System.out.println("vivo 停止打电话");}}
定义华为手机
public class HuaWeiBrand implements Brand{@Overridepublic void start() {System.out.println("华为 准备打电话");}@Overridepublic void call() {System.out.println("华为 打电话");}@Overridepublic void stop() {System.out.println("华为 停止打电话");}}
客户端代码
public class Client {public static void main(String[] args) {Phone waterDropScreenPhone = new WaterDropScreenPhone(new VIVOBrand());waterDropScreenPhone.start();waterDropScreenPhone.call();waterDropScreenPhone.stop();Phone curvedScreenPhone = new CurvedScreenPhone(new HuaWeiBrand());curvedScreenPhone.start();curvedScreenPhone.call();curvedScreenPhone.stop();}}
