sdfxs

Untitled

Jun 29th, 2021
716
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // Есть интерфейс Generator, который генерирует чисела в какой-то последовательности.
  2. interface IGenerator {
  3.     getNext: (count?: number) => number[]
  4. }
  5.  
  6. // Есть класс Client, использующий этот генератор для отображения чисел на экран
  7. class Client {
  8.     private _generator: IGenerator
  9.     constructor(generator: IGenerator) {
  10.         this._generator = generator
  11.     }
  12.     public doWork = () => {
  13.         console.log(this._generator.getNext(5))
  14.     }
  15. }
  16.  
  17. abstract class Component implements IGenerator {
  18.     protected parent: Component | null = null
  19.     public setParent(parent: Component | null) {
  20.         this.parent = parent
  21.     }
  22.     public getParent(): Component | null {
  23.         return this.parent
  24.     }
  25.     public add(component: Component): void {}
  26.     public remove(component: Component): void {}
  27.     public isComposite(): boolean {
  28.         return false
  29.     }
  30.     public abstract getNext(count?: number): number[]
  31. }
  32.  
  33. class Composite extends Component {
  34.     protected children: Component[] = []
  35.  
  36.     public add(component: Component): void {
  37.         this.children.push(component)
  38.         component.setParent(this)
  39.     }
  40.  
  41.     public remove(component: Component): void {
  42.         const componentIndex = this.children.indexOf(component)
  43.         this.children.splice(componentIndex, 1)
  44.  
  45.         component.setParent(null)
  46.     }
  47.  
  48.     public isComposite(): boolean {
  49.         return true
  50.     }
  51.  
  52.     public getNext(count?: number): number[] {
  53.     const results = []
  54.         for (const child of this.children) {
  55.             results.push(...child.getNext(count))
  56.         }
  57.  
  58.         return results
  59.     }
  60. }
  61.  
  62. class Generator extends Component {
  63.     public getNext = (count: number): number[] => {
  64.         let arr = []
  65.         for (let i = 0; i < count; i++) arr.push(i + 1);
  66.         return arr
  67.     }
  68. }
  69. class Generator1 extends Component {
  70.     public getNext = (count: number): number[] => {
  71.         let arr = []
  72.         for (let i = 0; i < count; i++) arr.push(i + 1);
  73.         return arr
  74.     }
  75. }
  76. class Generator2 extends Component {
  77.     public getNext = (count: number): number[] => {
  78.         let arr = []
  79.         for (let i = 0; i < count; i++) arr.push(Math.floor(Math.random( ) * (10)));
  80.         return arr
  81.     }
  82. }
  83. class Generator3 extends Component {
  84.     public getNext = (count: number): number[] => {
  85.         let arr = []
  86.         for (let i = count; i > 0; i--) arr.push(i);
  87.         return arr
  88.     }
  89. }
  90. /*
  91. 1) прямая последовательность целых чисел
  92. 2) случайные числа
  93. 3) обратная последовательность целых чисел
  94. 4) композит, объединяющий в себе один и более генераторов (в этом случае, генераторы вызываются поочередно)
  95. 5) продемонстрировать работу, когда композит стоит на нескольких уровнях:
  96. */
  97.  
  98. const client1 = new Client(new Generator1())
  99. client1.doWork()
  100.  
  101. const client2 = new Client(new Generator2())
  102. client2.doWork()
  103.  
  104. const client3 = new Client(new Generator3())
  105. client3.doWork()
  106.  
  107.  
  108. const branch1 = new Composite()
  109. branch1.add(new Generator1())
  110. branch1.add(new Generator3())
  111.  
  112. const client4 = new Client(branch1)
  113. client4.doWork()
  114.  
  115. const tree = new Composite();
  116. const leftBranch = new Generator2();
  117. const rightBranch = new Composite();
  118. const leftLeaf = new Generator1();
  119. const rightLeaf = new Generator3();
  120. rightBranch.add(leftLeaf);
  121. rightBranch.add(rightLeaf);
  122. tree.add(leftBranch);
  123. tree.add(rightBranch);
  124.  
  125. const client5 = new Client(tree);
  126. client5.doWork()
RAW Paste Data