typescript: Decorator Pattern

发布时间 2023-10-08 06:48:08作者: ®Geovin Du Dream Park™

 

/**
 * Decorator Pattern 装饰是一种结构设计模式, 允许你通过将对象放入特殊封装对象中来为原对象增加新的行为。
 * The base Component interface defines operations that can be altered by
 * decorators.
 */
interface ComponentDecorator {
    operation(): string;
}

/**
 * Concrete Components provide default implementations of the operations. There
 * might be several variations of these classes.
 */
class ConcreteComponent implements ComponentDecorator {

    /**
     * 
     * @returns 
     */
    public operation(): string {
        return 'ConcreteComponent';
    }
}

/**
 * The base Decorator class follows the same interface as the other components.
 * The primary purpose of this class is to define the wrapping interface for all
 * concrete decorators. The default implementation of the wrapping code might
 * include a field for storing a wrapped component and the means to initialize
 * it.
 */
class DecoratorDecorator implements ComponentDecorator {
    protected component: ComponentDecorator;
    /**
     * 
     * @param component 
     */
    constructor(component: ComponentDecorator) {
        this.component = component;
    }

    /**
     * The Decorator delegates all work to the wrapped component.
     * @returns 
     */
    public operation(): string {
        return this.component.operation();
    }
}

/**
 * Concrete Decorators call the wrapped object and alter its result in some way.
 */
class ConcreteDecoratorA extends DecoratorDecorator {
    /**
     * Decorators may call parent implementation of the operation, instead of
     * calling the wrapped object directly. This approach simplifies extension
     * of decorator classes.
     */
    public operation(): string {
        return `ConcreteDecoratorA(${super.operation()})`;
    }
}

/**
 * Decorators can execute their behavior either before or after the call to a
 * wrapped object.
 */
class ConcreteDecoratorB extends DecoratorDecorator {

    /**
     * 
     * @returns 
     */
    public operation(): string {
        return `ConcreteDecoratorB(${super.operation()})`;
    }
}

/**
 * The client code works with all objects using the Component interface. This
 * way it can stay independent of the concrete classes of components it works
 * with.
 */
function clientCodeDecorator(component: ComponentDecorator) {
    // ...
    let str="";
    console.log(`RESULT: ${component.operation()}`);
    return str=component.operation();
    // ...
}

/**
 * This way the client code can support both simple components...
 */
let puDec1="";
let puDec2="";
const simpleDecorator = new ConcreteComponent();
console.log('Client: I\'ve got a simple component:');
puDec1=clientCodeDecorator(simpleDecorator);
console.log('');

/**
 * ...as well as decorated ones.
 *
 * Note how decorators can wrap not only simple components but the other
 * decorators as well.
 */
const decorator1 = new ConcreteDecoratorA(simpleDecorator);
const decorator2 = new ConcreteDecoratorB(decorator1);
console.log('Client: Now I\'ve got a decorated component:');
puDec2=clientCodeDecorator(decorator2);

let messageDecorator: string = 'Hello World,This is a typescript!,涂聚文 Geovin Du Web';
document.body.innerHTML = messageDecorator+",one="+puDec1+",two="+puDec2+",TypeScript 装饰模式"

  

調用:

<!doctype html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport"
        content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <head><title>TypeScript:装饰模式</title>
      <meta name="Description" content="geovindu,涂聚文,Geovin Du"/>
<meta name="Keywords" content="geovindu,涂聚文,Geovin Du"/>
<meta name="author" content="geovindu,涂聚文,Geovin Du"/>  
    </head>
    <body>
        <script src="dist/Decoratorts.js"></script>
    </body>
</html>

  

輸出: