结构型
Ys 2020/12/13
# 结构型:优化结构的实现方式
# 适配器模式 - adapter
# 适配独立模块,保证模块间的独立解耦且连接兼容
# 需求: 买了一个港行 PS,插座是国标
class HKDevice {
getPlug() {
return "港行双圆柱插头";
}
}
class Target {
constructor() {
this.plug = new HKDevice();
}
getPlug() {
return this.plug.getPlug() + "+港行双圆柱转换器";
}
}
const target = new Target();
target.getPlug();
# 装饰器模式
# 动态将责任附加到对象上
# 设备升级
class Device {
create() {
console.log("PlayStation4");
}
}
class Phone {
create() {
console.log("iphone18");
}
}
class Decorator {
constructor(device) {
this.device = device;
}
create() {
this.device.create();
this.update(device);
}
update(device) {
console.log(device + "pro");
}
}
const device = new Device();
device.create();
const newDevice = new Decorator(device);
newDevice.create();
# 代理模式
# 使用代理人来替代原始对象
# 游戏防沉迷
class Game {
play() {
return "playing";
}
}
class Player {
constructor(age) {
this.age = age;
}
}
class GameProxy {
constructor(player) {
this.player = player;
}
play() {
return this.player.age < 16 ? "too young to play" : new Game().play();
}
}
const player = new Player(18);
const game = new GameProxy(player);
game.play();
# 模式场景
- 中间转换参数、保持模块间独立的时候 - 适配器模式
- 附着于多个组件上,批量动态赋予功能的时候 - 装饰器模式
- 将代理对象与调用对象分离,不直接调用目标对象 - 代理模式
# 实际应用
- 两个模块:筛选器和表格,需要做一个联动。但筛选器的数据不能直接传入表格,需要做数据结构转换 => 模块之间独立,需要做数据结构转换 => 适配器模式
- 目前有按钮、title、icon 三个组件。希望开发一个模块,让三个组件同时具备相同功能 => 套一层装甲对于每个组件,有统一的能力提升,且可以动态添加功能进行拓展 => 装饰器模式
- ul 中多个 li,每个 li 上的点击事件 => 利用冒泡做委托,事件绑定在 ul 上 => 代理模式