一、定义
将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度。
二、角色
抽象化(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);
}
@Override
public void start() {
System.out.println("曲面屏手机");
super.start();
}
@Override
public void call() {
System.out.println("曲面屏手机");
super.call();
}
@Override
public void stop() {
System.out.println("曲面屏手机");
super.stop();
}
}
水滴屏手机
public class WaterDropScreenPhone extends Phone{
public WaterDropScreenPhone(Brand brand) {
super(brand);
}
@Override
public void start() {
System.out.println("水滴屏手机");
super.start();
}
@Override
public void call() {
System.out.println("水滴屏手机");
super.call();
}
@Override
public void stop() {
System.out.println("水滴屏手机");
super.stop();
}
}
具体实现化(Concrete Implementor)角色
给出实现化角色接口的具体实现;
public class VIVOBrand implements Brand{
@Override
public void start() {
System.out.println("vivo 准备打电话");
}
@Override
public void call() {
System.out.println("vivo 打电话");
}
@Override
public void stop() {
System.out.println("vivo 停止打电话");
}
}
定义华为手机
public class HuaWeiBrand implements Brand{
@Override
public void start() {
System.out.println("华为 准备打电话");
}
@Override
public void call() {
System.out.println("华为 打电话");
}
@Override
public 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();
}
}