【问题标题】:Encapsulate the properties design pattern封装属性设计模式
【发布时间】:2017-03-29 23:07:11
【问题描述】:

我想封装文档是如何被激活的逻辑(布尔值)。当一个文档被激活时,它应该被添加到一个 activeDocuments 列表中,并且该标志应该设置为 true。我想禁止直接访问 isActive 属性。

class DocumentService {
      private activeDocuments : Map<DocumentModel> = new Map<DocumentModel>();

      // Activates the document and adds it to the list
      activateDocument(document: DocumentModel) {
                document.setActive();
                activeDocuments.set(document.id, document);
      }
}


class DocumentModel {
      private isActive: boolean;

      setActive() {
                this.isActive = true;
      }         
}

class DocumentComponent {
      documentSelected() {
           // this.document.setActive()  - SHOULD BE FORBIDDEN because the document is not added to the activedocument list !
           this.documentService.activateDocument(this.document);
      }
}

我为这个问题想出的唯一解决方案是创建两个接口 DocumentServiceInterface 有一个 setActive() 方法和 DocumentInterface 没有它所以它阻止 |DocumentComponent 激活文档但服务仍然可以激活文件。

有没有设计模式/配方可以解决这个问题?

遍历文档列表以检查它是否处于活动状态不是一个选项,因为应用程序中的结构要复杂得多,并且文档的数量应该可以扩展(例如可能有数千个文档)

【问题讨论】:

    标签: angularjs angular typescript design-patterns architecture


    【解决方案1】:

    您可以使用Mediator Design Pattern 来解决问题。或者如果您只想将方法隐藏到客户端代码,您可以使用 es2015 符号方法,然后您的 DocumentService 和 DocumentModel 之外的代码无法访问活动方法,因为 ACTIVE 的可见性仅在模块中可见,代码如下:

    const ACTIVE = Symbol("active");
    
    class DocumentService {
        private activeDocuments: Map<String,DocumentModel> = new Map<String,DocumentModel>();
    
        // Activates the document and adds it to the list
        activateDocument(document: DocumentModel) {
            document[ACTIVE]();
            this.activeDocuments.set(document.id, document);
        }
    
    }
    
    class DocumentModel {
        public id: string;
        private isActive: boolean;
    
        [ACTIVE]() {
            this.isActive = true;
        }
    }
    

    【讨论】:

      【解决方案2】:

      一个 javascript 特定的方法是这样的:

      setActive() {
          if (arguments.callee.caller.toString()!=='DocumentService')
               throw new Exception();
      }
      

      但我觉得它非常规且难以阅读

      【讨论】:

      • 打破接口隔离原则
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-14
      • 1970-01-01
      • 1970-01-01
      • 2011-02-23
      • 1970-01-01
      • 2015-01-26
      相关资源
      最近更新 更多