/** * Bridge Pattern 桥接是一种结构型设计模式, 可将业务逻辑或一个大类拆分为不同的层次结构, 从而能独立地进行开发。 * https://dev.to/takaakit/uml-diagram-for-gof-design-pattern-examples-in-typescript-46d5#singleton * The Abstraction defines the interface for the "control" part of the two class * hierarchies. It maintains a reference to an object of the Implementation * hierarchy and delegates all of the real work to this object. */ class AbstractionBridge { /** * */ protected implementation: Implementation; /** * * @param implementation */ constructor(implementation: Implementation) { this.implementation = implementation; } /** * * @returns */ public operation(): string { const result = this.implementation.operationImplementation(); return `Abstraction: Base operation with:\n${result}`; } } /** * You can extend the Abstraction without changing the Implementation classes. */ class ExtendedAbstraction extends AbstractionBridge { /** * * @returns */ public operation(): string { const result = this.implementation.operationImplementation(); return `ExtendedAbstraction: Extended operation with:\n${result}`; } } /** * The Implementation defines the interface for all implementation classes. It * doesn't have to match the Abstraction's interface. In fact, the two * interfaces can be entirely different. Typically the Implementation interface * provides only primitive operations, while the Abstraction defines higher- * level operations based on those primitives. */ interface Implementation { /** * */ operationImplementation(): string; } /** * Each Concrete Implementation corresponds to a specific platform and * implements the Implementation interface using that platform's API. */ class ConcreteImplementationA implements Implementation { /** * * @returns */ public operationImplementation(): string { return 'ConcreteImplementationA: Here\'s the result on the platform A.'; } } class ConcreteImplementationB implements Implementation { /** * * @returns */ public operationImplementation(): string { return 'ConcreteImplementationB: Here\'s the result on the platform B.'; } } /** * Except for the initialization phase, where an Abstraction object gets linked * with a specific Implementation object, the client code should only depend on * the Abstraction class. This way the client code can support any abstraction- * implementation combination. */ function clientCodeBridge(abstraction: AbstractionBridge) { // .. console.log(abstraction.operation()); return abstraction.operation(); // .. } /** * The client code should be able to work with any pre-configured abstraction- * implementation combination. */ let implementation = new ConcreteImplementationA(); let abstraction = new AbstractionBridge(implementation); clientCodeBridge(abstraction); let sbridge1=clientCodeBridge(abstraction); console.log(''); implementation = new ConcreteImplementationB(); abstraction = new ExtendedAbstraction(implementation); clientCodeBridge(abstraction); let sbridge="gevindu"; let sbridge2=clientCodeBridge(abstraction); let messagebridge: string = 'Hello World,This is a typescript!,涂聚文 Geovin Du Web'; document.body.innerHTML = messagebridge+","+sbridge1+","+sbridge2+",TypeScript Bridge Pattern 桥接模式"
调用:
<!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/Bridgets.js"></script> </body> </html>
输出: