跳到主要内容

绪论

基础

设计模式
  • 一种通用设计结构;
  • 用于构造可复用的面向对象设计;
类型
  • 创建型:用于对象的创建;
  • 结构型:用于处理类和对象的组合;
  • 行为型:用于类和对象的交互;
设计模式的关系

设计模式的关系

类继承和接口继承
  • 类继承:子类复用父类;
  • 接口继承;
    • 接口定义复用的方法;
    • 对象实现接口;
复用机制
  • 白箱复用:类继承;
    • 父类对子类可见;
  • 黑箱复用:组合;
    • 组合对象作为对象的一个属性;
    • 组合对象内部细节不可见;
    • 只知道组合对象的接口;
委托
  • 一种组合方法;
  • 使组合具有继承相同的复用能力;
  • 额外创建一个对象作为组合对象的代理者,代理对象实现组合对象的逻辑;
  • 对于组合对象的请求委托给代理对象;
原则
  • 面向接口编程,而不是针对实现编程;
  • 组合优于继承;

组合代替继承

使用组合代替继承
  • 使用抽象类作为基类继承;
  • 子类不可能都具有父类的行为;
    • 需要重写不具备的行为;
    • 减少复用性而且暴露了不应该存在的接口;
abstract class AbstractBird {
public abstract fly(): void;
public abstract eat(): void;
}

class MaQue extends AbstractBird {
public fly(): void {
//
}

public eat(): void {
//
}
}

class TuoNiao extends AbstractBird {
public fly(): void {
// 鸵鸟不会飞, 需要重写该方法
}

public eat(): void {
//
}
}
接口实现组合
  • 对象根据自己的行为选择对应接口进行实现;
  • 但是没有实现逻辑的复用;
interface IFlyAble {
fly(): void;
}

interface IEatAble {
eat(): void;
}

class MaQue implements IFlyAble, IEatAble {
eat(): void {
//
}
fly(): void {
//
}
}

class TuoNiao implements IEatAble {
eat(): void {
//
}
}
接口 + 委托实现组合
  • 使用委托将接口的逻辑进行复用;
  • 对象借助委托复用公共逻辑并按需实现自己的私有逻辑;
  • 创建委托时根据实际情况选择合理的粒度;
interface IFlyAble {
fly(): void;
}

interface IEatAble {
eat(): void;
}

// 创建委托
class FlyAbility {
fly() {
// fly() 的逻辑实现
}
}

class EatAbility {
eat() {
// eat() 的逻辑实现
}
}

class MaQue implements IFlyAble, IEatAble {
private _flyAbility;
private _eatAbility;

construct() {
this._flyAbility = new FlyAbility();
this._eatAbility = new EatAbility();
}

eat(): void {
this._eatAbility.eat();
// 私有实现
}

fly(): void {
this._flyAbility.fly();
// 私有实现
}
}

class TuoNiao implements IEatAble {
private _eatAbility;

construct() {
this._eatAbility = new EatAbility();
}

eat(): void {
this._eatAbility.eat();
}
}