乐趣区

图解23种设计模式TypeScript版前端切图仔提升内功的必经之路

关注公众号“执鸢者 ”,回复“ 书籍 ”获取大量前端学习资料, 回复“ 前端视频 ”获取大量前端教学视频,回复“ 设计模式”获取本节整体思维导图。

使用思维导图来阐述 23 种设计模式,并以 TypeScript 实现其代码,让我们前端切图崽写出的代码具有可扩展性、可复用性、减少代码冗余问题,提升自身内功。

一、设计原则

二、创建型模式

创建型模式包含单例模式、简单工厂模式、工厂方法模式、抽象工厂模式、原型模式、建造者模式。创建型模式就是创建对象的模式,抽象了实例化的过程。它帮助一个系统独立于如何创建、组合和表示它的那些对象。关注的是对象的创建,创建型模式将创建对象的过程进行了抽象,也可以理解为将创建对象的过程进行了封装,作为客户程序仅仅需要去使用对象,而不再关心创建对象过程中的逻辑。

2.1 单例模式

// 饿汉式
class Singleton1 {
    // 1. 构造器私有化,外部不能 new
    private constructor(){}

    // 2. 本类内部创建对象实例化
    private static instance : Singleton1 = new Singleton1();

    // 3. 提供一个公有的静态方法,返回实例对象
    public static getInstance() : Singleton1 {return this.instance;}
}

console.log(Singleton1.getInstance(), '11111');

// 懒汉式
class Singleton2 {private constructor(){}

    private static instance: Singleton2 = null;

    public static getInstance() : Singleton2 {if (this.instance === null) {this.instance = new Singleton2();
        }

        return this.instance;
    }
}

console.log(Singleton2.getInstance(), '2222')

2.2 简单工厂模式

// 抽象产品接口
interface Product{}

// 具体产品一
class ConcreteProduct1 implements Product {constructor(){}}

// 具体产品二
class ConcreteProduct2 implements Product {constructor(){}}

// 简单工厂
class SimpleFactory {public static createProduct(type : number) : Product {
        let product = null;
        if (type === 1) {product = new ConcreteProduct1();
        } else if (type === 2) {product = new ConcreteProduct2();
        }

        return product;
    }
}

// 使用
let product = SimpleFactory.createProduct(1);
console.log(product);

2.3 工厂方法模式

// 抽象产品接口
interface Product2{method1() : void;
    method2() : void;}

// 具体产品一
class ConcreteProduct_1 implements Product2 {constructor(){}
    method1() {}
    method2() {}
}

// 具体产品二
class ConcreteProduct_2 implements Product2 {constructor(){}
    method1() {}
    method2() {}
}

// 抽象工厂
abstract class Creator {public abstract createProduct(type : number) : Product;
}

// 具体工厂
class ConcreteCreator extends Creator {constructor(){super();
    }

    public createProduct(type : number) : Product {
        let product = null;
        if (type === 1) {product = new ConcreteProduct_1();
        } else if (type === 2) {product = new ConcreteProduct_2();
        }
        return product;
    }
}

// 使用
const creator : Creator = new ConcreteCreator();
const myProduct : Product = creator.createProduct(1);

2.4 抽象工厂模式

// 抽象工厂接口
interface AbstractFactory {createProductA() : AbstractProductA;
    createProductB() : AbstractProductB;}

// 抽象产品 A 接口
interface AbstractProductA {}

// 抽象产品 B 接口
interface AbstractProductB {}

// 具体工厂 1
class ConcreteFactory1 implements AbstractFactory {constructor() {}
    public createProductA() : AbstractProductA {return new ConcreteProductA1();
    }
    public createProductB() : AbstractProductB {return new ConcreteProductB1();
    }
}

// 具体工厂 2
class ConcreteFactory2 implements AbstractFactory {constructor() {}
    public createProductA() : AbstractProductA {return new ConcreteProductA2();
    }
    public createProductB() : AbstractProductB {return new ConcreteProductB2();
    }
}

// 具体产品 A1
class ConcreteProductA1 implements AbstractProductA {}
// 具体产品 A2
class ConcreteProductA2 implements AbstractProductA {}
// 具体产品 B1
class ConcreteProductB1 implements AbstractProductB {}
// 具体产品 B2
class ConcreteProductB2 implements AbstractProductA {}

// 使用
const factory1 : AbstractFactory = new ConcreteFactory1();
const factory2 : AbstractFactory = new ConcreteFactory2();
const productA1 : AbstractProductA = factory1.createProductA();
const productA2 : AbstractProductA = factory2.createProductA();
const productB1 : AbstractProductB = factory1.createProductB();
const productB2 : AbstractProductB = factory2.createProductB();

2.5 原型模式

interface Prototype {clone():Prototype;
}

class Dog implements Prototype {
    public name: string;
    public birthYear: number;
    public sex: string;
    public presentYear: number;
    constructor() {
        this.name = "lili";
        this.birthYear = 2015;
        this.sex = "男";
        this.presentYear = 2018;
    }

    public getDiscription(): string {return ` 狗狗叫 ${this.name}, 性别 ${this.sex},${this.presentYear}年 ${this.presentYear - this.birthYear}岁了 `
    }

    // 实现复制
    public clone(): Prototype {return Object.create(this);
    }
}

// 使用
const dog = new Dog();
console.log(dog.getDiscription());
dog.presentYear = 2020;
const dog1 = Object.create(dog);
console.log(dog1.getDiscription());

2.6 建造者模式

// 抽象建造者
abstract class Builder {public abstract buildPartA() : void;
    public abstract buildPartB() : void;
    public abstract buildPartC() : void;
    public abstract buildProduct() : Product;}

// 具体建造者
class ConcreteBuilder extends Builder {
    private product : Product;
    constructor(product : Product) {super();
        this.product = product;
    }

    public buildPartA() : void {}
    public buildPartB() : void {}
    public buildPartC() : void {}

    // 最终组建一个产品
    public buildProduct() : Product {return this.product;}
}

// 产品角色
class Product {public doSomething() : void {// 独立业务}
}

// 指挥者
class Director {
    private _builder : Builder;
    constructor(builder : Builder) {this._builder = builder;}

    set builder(builder : Builder) {this._builder = builder;}

    // 将处理建造的流程交给指挥者
    public constructorProduct() {this._builder.buildPartA();
        this._builder.buildPartB();
        this._builder.buildPartC();
        return this._builder.buildProduct();}
}

// 使用
const builder : Builder = new ConcreteBuilder(new Product());
const director : Director = new Director(builder);
const product : Product = director.constructorProduct();

三、结构型模式

结构型模式包含适配器模式、桥接模式、装饰模式、组合模式、外观模式、享元模式、代理模式。结构型模式为解决怎样组装现有的类,设计他们的交互方式,从而达到实现一定的功能。

3.1 适配器模式

// 类适配器
// 目标对象
interface Target {request() : void;
}
// 被适配者
class Adaptee {constructor() {}
    // 这是源角色,有自己的的业务逻辑
    public specificRequest() : void {}
}
// 适配器
class Adapter extends Adaptee implements Target {constructor() {super();
    }
    public request() : void {super.specificRequest();
    }
}

const target : Target = new Adapter();
target.request();
// 对象适配器
// 目标对象
interface Target {request() : void;
}
// 被适配者
class Adaptee {constructor() {}
    // 这是源角色,有自己的的业务逻辑
    public specificRequest() : void {}
}
// 适配器
class Adapter implements Target {
    private adaptee : Adaptee;
    constructor(adaptee : Adaptee) {this.adaptee = adaptee;}
    public request() : void {this.adaptee.specificRequest();
    }
}
// 使用
const target : Target = new Adapter(new Adaptee());
target.request();
// 接口适配器
interface Adaptee {operation1() : void;
    operation2() : void;}

abstract class AbsAdapter implements Adaptee {public operation1() : void {}
    public operation2() : void {} 
}

class UseClass extends AbsAdapter {public operation1() : void {}// 重写该类}

3.2 桥接模式

// 实现接口角色
interface Implementor {doSomething() : void;
    doAnything() : void;}

// 具体实现角色
class ConcreteImplementor1 implements Implementor {public doSomething() : void { }
    public doAnything() : void {}
}
class ConcreteImplementor2 implements Implementor {public doSomething() : void { }
    public doAnything() : void {}
}

// 抽象类
abstract class Abstraction {
    private imp : Implementor;
    constructor(imp : Implementor) {this.imp = imp;}

    // 自身的行为和属性
    public request() : void {this.imp.doSomething();
    }
}
// 具体抽象化角色
class RefinedAbstraction extends Abstraction {constructor(imp : Implementor) {super(imp);
    }

    public request() : void {
        // 自己写一些处理业务
        super.request();}
}

// 调用
// 定义一个实现化角色
const imp : Implementor = new ConcreteImplementor1();
// 定义一个抽象化角色
const abs : Abstraction = new RefinedAbstraction(imp);
// 执行上下文
abs.request();

3.3 装饰者模式

// 抽象构件
abstract class Component {public abstract operate() : void;
}

// 具体构件
class ConcreteComponent extends Component {public operate() : void {console.log('do something');
    }
}

// 装饰角色
abstract class Decorator extends Component {
    private component : Component = null;
    constructor(component : Component) {super();
        this.component = component;
    }

    public operate() : void {this.component.operate();
    }
}

// 具体装饰者
class ConcreteDecoratorA extends Decorator {constructor(component : Component) {super(component);
    }

    // 定义自己的修饰方法
    private methodA() : void {console.log('methodA 修饰');
    }

    // 重写父类方法
    public operate() : void {this.methodA();
        super.operate();}
}

class ConcreteDecoratorB extends Decorator {constructor(component : Component) {super(component);
    }

    // 定义自己的修饰方法
    private methodB() : void {console.log('methodB 修饰');
    }

    // 重写父类方法
    public operate() : void {this.methodB();
        super.operate();}
}

function main() {let component : Component = new ConcreteComponent();
    // 第一次装饰
    component = new ConcreteDecoratorA(component);
    // 第二次装饰
    component = new ConcreteDecoratorB(component);
    // 装饰后运行
    component.operate();}

main();

3.4 组合模式

abstract class Component {
    protected name : string;
    constructor(name : string) {this.name = name;}

    public abstract doOperation() : void;

    public add(component : Component) : void { }

    public remove(component : Component) : void { }

    public getChildren() : Array<Component> {return [];
    }
}

class Composite extends Component {
    // 构件容器
    private componentList : any;
    constructor(name : string) {super(name);
        this.componentList = [];}

    public doOperation() : void {console.log(` 这是容器 ${this.name},处理一些逻辑业务!`);
    }

    public add(component : Component) : void {this.componentList.push(component);
    }

    public remove(component : Component) : void {const componentIndex = this.componentList.findIndex((value : Component, index : Number) => {return value == component;});
        this.componentList.splice(componentIndex, 1);
    }

    public getChildren() : Array<Component> {return this.componentList;}
}

class Leaf extends Component {constructor(name : string) {super(name);
    }

    public doOperation() : void {console.log(` 这是叶子节点 ${this.name},处理一些逻辑业务!`);
    }
}

function main() {const root : Component  = new Composite('root');
    const node1 : Component = new Leaf('1');
    const node2 : Component = new Composite('2');
    const node3 : Component = new Leaf('3');

    root.add(node1);
    root.add(node2);
    root.add(node3);

    const node2_1 : Component = new Leaf("2_1");
    node2.add(node2_1);

    const children1 = root.getChildren();
    console.log(children1);

    root.remove(node2);

    const children2 = root.getChildren();
    console.log(children2);
}

main();

3.5 外观模式

class SubSystemA {public doOperationA() : void {console.log('子系统 A 的举动');
    }
}

class SubSystemB {public doOperationB() : void {console.log('子系统 B 的举动');
    }
}

class Facade {
    private subSystemA : SubSystemA;
    private subSystemB : SubSystemB;
    constructor() {this.subSystemA = new SubSystemA();
        this.subSystemB = new SubSystemB();}

    public doOperation() : void {this.subSystemA.doOperationA();
        this.subSystemB.doOperationB();}
}

function main() {const facade : Facade = new Facade();
    facade.doOperation();}

main();

3.6 享元模式

abstract class Flyweight {public abstract doOperation(extrinsicState : string) : void;
}

class ConcreteFlyweight extends Flyweight {
    private intrinsicState : string;
    constructor(intrinsicState : string) {super();
        this.intrinsicState = intrinsicState;
    }

    public doOperation(extrinsicState : string) : void {console.log(` 这是具体享元角色,内部状态为 ${this.intrinsicState}, 外部状态为 ${extrinsicState}`);
    }
}

interface flyweightObject {[key : string] : Flyweight
}

class FlyweightFactory {
    private flyweights : flyweightObject;
    constructor() {this.flyweights = {};
    }

    public getFlyweight(intrinsicState : string) : Flyweight {if (!this.flyweights[intrinsicState]) {const flyweight : Flyweight = new ConcreteFlyweight(intrinsicState);
            this.flyweights[intrinsicState] = flyweight;
        }
        return this.flyweights[intrinsicState];
    }
}

function main() {const factory : FlyweightFactory = new FlyweightFactory();
    const flyweight1 : Flyweight = factory.getFlyweight("aa");
    const flyweight2 : Flyweight = factory.getFlyweight("aa");
    flyweight1.doOperation('x');
    flyweight2.doOperation('y');
}

main();

3.7 代理模式

// 静态代理
interface Subject {doOperation() : void;
}

class RealSubject implements Subject {public doOperation() {console.log('我是 RealSubject 类,正在执行');
    }
}

class MyProxy implements Subject {
    private target : Subject;
    constructor(realSubject : Subject) {this.target = realSubject;}

    public doOperation() {console.log('我是代理类');
        this.target.doOperation();}
}

function main() {const realSubject : Subject = new RealSubject();
    const myProxy : Subject = new MyProxy(realSubject);

    myProxy.doOperation();}

main();
// 动态代理
interface Subject {doOperation() : void;
}

class RealSubject implements Subject {constructor() {}

    public doOperation() : void {console.log('我是 RealSubject 类,正在执行');
    }
}

class ProxyFactory {
    private target : any;
    constructor(target : any) {this.target = target;}

    public getProxyInstance() : any {
        return new Proxy(this.target, {get: (target, propKey) => {
                // 做的一些拦截处理
                return target[propKey];
            }
        });
    }
}

function main() {const target : Subject = new RealSubject();
    const proxyInstance : Subject = <Subject>new ProxyFactory(target).getProxyInstance();

    proxyInstance.doOperation();}

main();

四、行为型模式

行为型模式包含模板方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式(Interpreter 模式)、状态模式、策略模式、职责链模式(责任链模式)。行为型模式对在不同的对象之间划分责任和算法的抽象化,行为型模式不仅仅关注类和对象的结构,而且重点关注他们之间的相互作用,通过行为型模式,可以更加清晰地划分类与对象的职责,并研究系统在运行时实例对象之间的交互。

4.1 模板方法模式

abstract class AbstractClass {constructor() {}

    // 模板方法
    public template() : void {this.operation1();
        this.hookMethod() && this.operation2();
        this.operation3();}

    // 基本方法
    protected operation1() : void {console.log('使用了方法 operation1');
    }

    protected operation2() : void {console.log('使用了方法 operation2');
    }

    protected operation3() : void {console.log('使用了方法 operation3');
    }

    // 钩子方法
    protected hookMethod() : boolean {return true;}
}

class ConcreteClassA extends AbstractClass {protected operation2() :void {console.log('对该方法 operation2 进行了修改再使用');
    }

    protected operation3() :void {console.log('对该方法 operation3 进行了修改再使用');
    }
}

class ConcreteClassB extends AbstractClass {
    // 覆盖钩子方法
    protected hookMethod() : boolean {return false;}
}

function main() {const class1 : AbstractClass = new ConcreteClassA();
    const class2 : AbstractClass = new ConcreteClassB();

    class1.template();
    class2.template();}

main();

4.2 命令模式

interface Command {execute() : void;
    undo() : void;}

// 开启命令
class ConcreteCommandOn implements Command {
    private receiver : Receiver;
    constructor(receiver : Receiver) {this.receiver = receiver;}

    // 执行命令的方法
    public execute() : void {this.receiver.actionOn();
    }

    // 撤销命令的方法
    public undo() : void {this.receiver.actionOff();
    }
}

// 关闭命令
class ConcreteCommandOff implements Command {
    private receiver : Receiver;
    constructor(receiver : Receiver) {this.receiver = receiver;}

    // 执行命令的方法
    public execute() : void {this.receiver.actionOff();
    }

    // 撤销命令的方法
    public undo() : void {this.receiver.actionOn();
    }
}

// 空命令(省去判空操作)class NoCommand implements Command {public execute() : void {}
    public undo() : void {}
}

class Receiver {public actionOn() : void {console.log('我是命令接收者,开启了某动作');
    }
    public actionOff() : void {console.log('我是命令接收者,关闭了某动作');
    }
}

class Invoker {
    private onCommands : Array<Command>;
    private offCommands : Array<Command>;
    private undoCommand : Command;
    private slotNum : number = 7;
    constructor() {this.undoCommand = new NoCommand();
        this.onCommands = [];
        this.offCommands = [];

        for (let i = 0; i < this.slotNum; i++) {this.onCommands[i] = new NoCommand();
            this.offCommands[i] =  new NoCommand();}
    }

    public setCommand(index : number, onCommand : Command, offCommand : Command) : void {this.onCommands[index] = onCommand;
        this.offCommands[index] = offCommand;
    }

    // 开启
    public on (index : number) : void {this.onCommands[index].execute();// 调用相应方法
        // 记录这次操作,用于撤销
        this.undoCommand = this.onCommands[index];
    }

    // 关闭
    public off (index : number) : void {this.offCommands[index].execute();
        this.undoCommand = this.offCommands[index];
    }

    // 撤销
    public undo () : void {this.undoCommand.undo();
    }
}

function main() {
    // 创建接收者
    const receiver : Receiver = new Receiver();

    // 创建命令
    const commandOn : Command = new ConcreteCommandOn(receiver);
    const commandOff : Command = new ConcreteCommandOff(receiver);

    // 创建调用者
    const invoker : Invoker = new Invoker();
    invoker.setCommand(0, commandOn, commandOff);

    invoker.on(0);
    invoker.off(0);
    invoker.undo();}

main();

4.3 访问者模式

abstract class AbstractElement {
    // 定义业务逻辑
    public abstract doSomething() : void;
    // 允许谁来访问
    public abstract accept (visitor : Visitor) : void;
}

class ConcreteElement1 extends AbstractElement{public doSomething() : void {console.log('ConcreteElement1 执行的业务逻辑');
    }

    public accept(visitor : Visitor) : void {visitor.visit1(this)
    }
}

class ConcreteElement2 extends AbstractElement{public doSomething() : void {console.log('ConcreteElement1 执行的业务逻辑');
    }

    public accept(visitor : Visitor) : void {visitor.visit2(this)
    }
}

abstract class Visitor {public abstract visit1(element1 : ConcreteElement1) : void;
    public abstract visit2(element2 : ConcreteElement2) : void;
}

class ConcreteVistor extends Visitor {public visit1(element1 : ConcreteElement1) : void {console.log('进入处理 element1')
        element1.doSomething();}

    public visit2(element2 : ConcreteElement2) : void {console.log('进入处理 element2');
        element2.doSomething();}
}

// 数据结构,管理很多元素(ConcreteElement1,ConcreteElement1)class ObjectStructure {
    private listSet : Set<AbstractElement>;
    constructor() {this.listSet = new Set();
    }

    // 增加
    public attach(element : AbstractElement) : void {this.listSet.add(element);
    }

    // 删除
    public detach(element : AbstractElement) : void {this.listSet.delete(element);
    }

    // 显示
    public display(visitor : Visitor) : void {for (let element of this.listSet.values()) {element.accept(visitor);
        }
    } 
}

function main() {const objectStructure : ObjectStructure = new ObjectStructure();
    objectStructure.attach(new ConcreteElement1());
    objectStructure.attach(new ConcreteElement2());

    const visitor :Visitor = new ConcreteVistor();

    objectStructure.display(visitor);
}

main();

4.4 迭代器模式

interface AbstractIterator {next() : any;
    hasNext() : boolean;
    remove() : boolean;}

class ConcreteIterator implements  AbstractIterator {private list : any[];
    public cursor : number = 0;
    constructor(array : any[]) {this.list = array;}

    public next() : any {return this.hasNext() ? this.list[this.cursor++] : null;
    }

    public hasNext() : boolean {return this.cursor < this.list.length;}

    public remove() : boolean{this.list.splice(this.cursor--, 1);
        return true;
    }
}

interface Aggregate {add(value : any) : void;
    remove(value : any) : void;
    createIterator() : AbstractIterator;}

class ConcreteAggregate implements Aggregate {
    // 容纳对象的容器
    private list : any[];
    constructor() {this.list = [];
    }

    add(value : any) : void {this.list.push(value)
    }

    remove(value : any) : void {const index = this.list.findIndex((listValue) => {return value === listValue;});
        this.list.splice(index, 1);
    }

    createIterator() : AbstractIterator {return new ConcreteIterator(this.list);
    }
}

function main() {const aggregate : Aggregate = new ConcreteAggregate();
    aggregate.add('11111');
    aggregate.add('222222');

    const iterator : AbstractIterator = aggregate.createIterator();
    while(iterator.hasNext()) {console.log(iterator.next());
    }
}

main();

4.5 观察者模式

// 观察者模式
interface AbstractSubject {registerObserver(observer : Observer) : void;
    remove(observer : Observer) : void;
    notifyObservers() : void;}

class ConcreteSubject implements AbstractSubject {
    private observers : Array<Observer>;

    constructor() {this.observers = [];
    }

    public registerObserver(observer : Observer) : void {this.observers.push(observer);
    };

    public remove(observer : Observer) : void {
        const observerIndex = this.observers.findIndex(value => {return value == observer;})

        observerIndex >= 0 && this.observers.splice(observerIndex, 1);
    };

    public notifyObservers() : void {this.observers.forEach(observer => observer.update())
    };
}

interface Observer {update() : void;
}

class ConcreteObserver1 implements Observer {public update() : void {console.log('已经执行更新操作 1,值为');
    }
}
class ConcreteObserver2 implements Observer {public update() : void {console.log('已经执行更新操作 2,值为');
    }
}

function main() {const subject : AbstractSubject = new ConcreteSubject();
    const observer1 : Observer = new ConcreteObserver1();
    const observer2 : Observer = new ConcreteObserver2();
    
    subject.registerObserver(observer1);
    subject.registerObserver(observer2);

    subject.notifyObservers();}

main();
// 发布订阅模式
interface Publish {registerObserver(eventType : string, subscribe : Subscribe) : void;
    remove(eventType : string, subscribe ?: Subscribe) : void;
    notifyObservers(eventType : string) : void;
}
interface SubscribesObject{[key : string] : Array<Subscribe>
}
class ConcretePublish implements Publish {
    private subscribes : SubscribesObject;

    constructor() {this.subscribes = {};
    }

    registerObserver(eventType : string, subscribe : Subscribe) : void {if (!this.subscribes[eventType]) {this.subscribes[eventType] = [];}

        this.subscribes[eventType].push(subscribe);
    }

    remove(eventType : string, subscribe ?: Subscribe) : void {const subscribeArray = this.subscribes[eventType];
        if (subscribeArray) {if (!subscribe) {delete this.subscribes[eventType];
            } else {for (let i = 0; i < subscribeArray.length; i++) {if (subscribe === subscribeArray[i]) {subscribeArray.splice(i, 1);
                    }
                }
            }
        }
    }

    notifyObservers(eventType : string, ...args : any[]) : void {const subscribes = this.subscribes[eventType];
        if (subscribes) {subscribes.forEach(subscribe => subscribe.update(...args))
        }
    }
}

interface Subscribe {update(...value : any[]) : void;
}

class ConcreteSubscribe1 implements Subscribe {public update(...value : any[]) : void {console.log('已经执行更新操作 1,值为', ...value);
    }
}
class ConcreteSubscribe2 implements Subscribe {public update(...value : any[]) : void {console.log('已经执行更新操作 2,值为', ...value);
    }
}

function main() {const publish = new ConcretePublish();
    const subscribe1 = new ConcreteSubscribe1();
    const subscribe2 = new ConcreteSubscribe2();

    publish.registerObserver('1', subscribe1);
    publish.registerObserver('2', subscribe2);

    publish.notifyObservers('2', '22222');
}

main();

4.6 中介者模式

abstract class Colleague {public abstract onEvent(eventType : string) : void;
}

class ConcreteColleagueA extends Colleague{
    private mediator : Mediator;
    constructor(mediator : Mediator) {super();
        this.mediator = mediator;
    }
    public onEvent(eventType : string) : void {this.mediator.doEvent(eventType);
    }

    // 自己的一些事情
    public doSomething() : void {console.log('A 被运行了');
    }
}

class ConcreteColleagueB extends Colleague {
    private mediator : Mediator;
    constructor(mediator : Mediator) {super();
        this.mediator = mediator;
    }

    public onEvent(eventType : string) : void {this.mediator.doEvent(eventType);
    }

    // 自己的一些事情
    public doSomething() : void {console.log('B 被运行了');
    }
}

abstract class Mediator {
    protected _colleagueA ?: ConcreteColleagueA;
    protected _colleagueB ?: ConcreteColleagueB;

    set colleagueA(colleagueA : ConcreteColleagueA) {this._colleagueA = colleagueA;}

    set colleagueB(colleagueB : ConcreteColleagueB) {this._colleagueB = colleagueB;}
    public abstract doEvent(eventType : string) : void;
}

class ConcreteMediator extends Mediator {
    //1. 根据得到消息,完成对应任务
    //2. 中介者在这个方法,协调各个具体的同事对象,完成任务
    public doEvent(eventType : string) : void {switch (eventType) {
            case "A": {this.doColleagueAEvent();
                break;
            }
            case "B": {this.doColleagueBEvent();
                break;
            }
            default: {}}
    }

    // 相应业务逻辑
    public doColleagueAEvent() : void {super._colleagueA && super._colleagueA.doSomething();
        super._colleagueB && super._colleagueB.doSomething();
        console.log('A- B 执行完毕');
    }

    public doColleagueBEvent() : void {super._colleagueB && super._colleagueB.doSomething();
        super._colleagueA && super._colleagueA.doSomething();
        console.log('B- A 执行完毕');
    }
}


function main() {const mediator : Mediator = new ConcreteMediator();
    const myColleagueA : ConcreteColleagueA = new ConcreteColleagueA(mediator);
    const myColleagueB : ConcreteColleagueB = new ConcreteColleagueB(mediator);
    mediator.colleagueA = myColleagueA;
    mediator.colleagueB = myColleagueB;

    myColleagueA.onEvent('A');
    myColleagueB.onEvent('B');
}

main();

4.7 备忘录模式

class Originator {
    private _state : string = '';
    constructor() {}

    get state() {return this._state;}

    set state(value) {this._state = value;}

    // 创建一个备忘录
    public createMemento() : Memento {console.log('创建了一个备忘录!');
        return new Memento(this._state);
    }

    // 恢复一个备忘录
    public recoverMemento(memento : Memento) {console.log('恢复了一个备忘录!');
        this.state = memento.state;
    }
}

class Memento {
    private _state : string;
    constructor(state : string) {this._state = state;}

    get state() : string {return this._state;}
}

class Caretaker {
    // 保存一次状态用此,保存多次用数组
    private memento ?: Memento;

    public getMemento() : Memento | undefined {return this.memento;}

    public setMemento(memento : Memento) {this.memento = memento;}
}

function main() {
    // 定义发起人
    const originator : Originator = new Originator();
    // 定义守护者
    const caretaker : Caretaker = new Caretaker();
    // 创建一个备忘录
    const memento : Memento = originator.createMemento();
    // 将备忘录存储到守护者
    caretaker.setMemento(memento);
    // 恢复一个备忘录
    originator.recoverMemento(memento);
}

main();

4.8 解释器模式

// 以下是一个规则检验器实现,具有 and 和 or 规则,通过规则可以构建一颗解析树,用来检验一个文本是否满足解析树定义的规则。// 例如一颗解析树为 D And (A Or (B C)),文本 "D A" 满足该解析树定义的规则
abstract class Expression {public abstract interpreter(str : string) : boolean;
}

class TerminalExpression extends Expression {
    private literal : string;
    constructor(str : string) {super();
        this.literal = str;
    }

    public interpreter(str : string) : boolean {for (let charVal of str) {if (charVal === this.literal) {return true;}
        }

        return false;
    }
}

class AndExpression extends Expression {
    private expression1 : Expression;
    private expression2 : Expression;

    constructor(expression1 : Expression, expression2 : Expression) {super();
        this.expression1 = expression1;
        this.expression2 = expression2;
    }

    public interpreter(str : string) : boolean {return this.expression1.interpreter(str) && this.expression2.interpreter(str);
    }
}

class OrExpression extends Expression {
    private expression1 : Expression;
    private expression2 : Expression;

    constructor(expression1 : Expression, expression2 : Expression) {super();
        this.expression1 = expression1;
        this.expression2 = expression2;
    }

    public interpreter(str : string) : boolean {return this.expression1.interpreter(str) || this.expression2.interpreter(str);
    }
}

function buildInterpreterTree() {const terminal1 : Expression = new TerminalExpression('A');
    const terminal2 : Expression = new TerminalExpression('B');
    const terminal3 : Expression = new TerminalExpression('C');
    const terminal4 : Expression = new TerminalExpression('D');

    // B And C
    const alternation1 : Expression = new AndExpression(terminal2, terminal3);
    // A Or (B C)
    const alternation2 : Expression = new OrExpression(terminal1, alternation1);
    // D And (A Or (B C))
    return new AndExpression(terminal4, alternation2);
}

function main() {const define : Expression = buildInterpreterTree();
    const context1 : string = "D A";
    const context2 : string = "D B C";
    console.log(define.interpreter(context1));
    console.log(define.interpreter(context2));
}

main();

4.9 状态模式

abstract class State {public abstract handle1() : void;
    public abstract handle2() : void;}

class ConcreteState1 extends State {
    private context : Context;
    constructor(context : Context) {super();
        this.context = context;
    }

    // 本状态下需要处理的逻辑
    public handle1() : void {console.log('State1 的状态需要处理的逻辑');
    }

    // 将进行状态转移
    public handle2() : void {
        this.context.currentState = this.context.STATE2;
        console.log('由状态 state1 转为 state2');
    }
}

class ConcreteState2 extends State {
    private context : Context;
    constructor(context : Context) {super();
        this.context = context;
    }

    // 进行状态转移
    public handle1() : void {
        this.context.currentState = this.context.STATE1;
        console.log('由状态 state2 转为 state1');
    }

    // 本状态下的处理逻辑
    public handle2() : void {console.log('State2 的状态需要处理的逻辑');
    }
}

class Context {public STATE1 : State = new ConcreteState1(this);
    public STATE2 : State = new ConcreteState2(this);
    public currentState : State;

    constructor() {this.currentState = this.STATE1;}

    public doOperation1() {this.currentState?.handle2();
    }
    public doOperation2() {this.currentState?.handle1();
    }
}

function main() {const context : Context = new Context();
    context.doOperation1();
    context.doOperation2();}

main();

4.10 策略模式

interface Strategy {
    // 策略模式运算法则
    doSomething() : void;}

class ConcreteStrategy1 implements Strategy {public doSomething() : void {console.log('使用的策略 1');
    }
}

class ConcreteStrategy2 implements Strategy {public doSomething() : void {console.log('使用的策略 2');
    }
}

class ContextofStrategy {
    private _strategy : Strategy;
    constructor(strategy : Strategy) {this._strategy = strategy;}

    set strategy(strategy : Strategy) {this._strategy = strategy;}

    // 封装后的策略方法
    doOperation() : void {this._strategy.doSomething();
    }
}

function main() {const strategy1 : Strategy = new ConcreteStrategy1();
    const strategy2 : Strategy = new ConcreteStrategy2();
    const context : ContextofStrategy = new ContextofStrategy(strategy1);
    context.doOperation();
    context.strategy = strategy2;
    context.doOperation();}

main();

4.11 职责链模式

abstract class Handler {
    // 下一个处理者
    public successor ?: Handler;
    public name : string;
    constructor(name : string) {this.name = name;}

    public abstract handleRequest(request : MyRequest) : void;

    public setNext(successor : Handler) : void {this.successor = successor;}
}

class ConcreteHandler1 extends Handler {constructor(name : string) {super(name);
    }

    public handleRequest (request : MyRequest) : void {
        // 首先判断当前级别是否能够处理,不能够处理则交给下一个级别处理
        if (request.level <= 1) {console.log('被一级处理');
        } else {
            // 交给下一级处理
            this.successor && this.successor.handleRequest(request);
        }
    }
}

class ConcreteHandler2 extends Handler {constructor(name : string) {super(name);
    }

    public handleRequest (request : MyRequest) : void {
        // 首先判断当前级别是否能够处理,不能够处理则交给下一个级别处理
        if (request.level > 1 && request.level <= 2) {console.log('被二级处理');
        } else {
            // 交给下一级处理
            this.successor && this.successor.handleRequest(request);
        }
    }
}

class ConcreteHandler3 extends Handler {constructor(name : string) {super(name);
    }

    public handleRequest (request : MyRequest) : void {
        // 首先判断当前级别是否能够处理,不能够处理则交给下一个级别处理
        if (request.level > 2) {console.log('被三级处理');
        } else {
            // 交给下一级处理
            this.successor && this.successor.handleRequest(request);
        }
    }
}

class MyRequest {
    private _level : number;
    constructor(level : number) {this._level = level;}

    get level() : number {return this._level;}

    set level(value : number) {this._level = this.level;}
}

function main() {
    // 创建一个请求
    const request : MyRequest = new MyRequest(5);

    // 创建相关处理人
    const handler1 : Handler = new ConcreteHandler1('lili');
    const handler2 : Handler = new ConcreteHandler2('linlin');
    const handler3 : Handler = new ConcreteHandler3('shunshun');

    // 设置下级别审批,构成环形结构
    handler1.setNext(handler2);
    handler2.setNext(handler3);
    handler3.setNext(handler1);

    handler1.handleRequest(request);
}

main();

相关章节 <br/>
图解 JavaScript————基础篇 <br/>
图解 JavaScript————进阶篇 <br/>

欢迎大家关注公众号(回复“设计模式”获取本节的思维导图, 回复“书籍”获取大量前端学习资料, 回复“前端视频”获取大量前端教学视频)

退出移动版