设计模式之规约模式C#版

规约模式的使用场景就是规则,业务规则的碎片化。

业务规则的组合是不固定的,需要做成很容易组合,也很容易拆散的方式,规约模式是一个选择。

下面的例子是一个书店中,用户租书的场景。

需要判断用户的最大租书数和用户的状态,需要同时满足这两个要求,才可以继续租书。最大租书数和状态这两个规则拆散开来,在需要的时候再进行组合。不需要组合的地方,就单独使用这些规则。

针对一个实体有不同的规则,把这些规则碎片化,随意组合和拆散,这样就构成了规约模式。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; 

namespace DomainModel.Model
{
    /// <summary>
    /// 规约模式
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public interface ISpecification<T>
    {
        bool IsSatisfiedBy(T entity);
        /// <summary>
        /// 与规约
        /// </summary>
        /// <param name="specification"></param>
        /// <returns></returns>
        ISpecification<T> And(ISpecification<T> specification);
        /// <summary>
        /// 或规约
        /// </summary>
        /// <param name="specification"></param>
        /// <returns></returns>
        ISpecification<T> Or(ISpecification<T> specification);
        /// <summary>
        /// 非规约
        /// </summary>
        /// <returns></returns>
        ISpecification<T> Not();
    } 

    public class Customer
    {
        private ISpecification<Customer> _hasReachedMax;
        private ISpecification<Customer> _active; 

        public Customer(ISpecification<Customer> hasReachedMax, ISpecification<Customer> active)
        {
            this._hasReachedMax = hasReachedMax;
            this._active = active;
        }
        public int TotalRentNumber { get; set; }
        public bool Active
        {
            get { return true; }
        } 

        public bool CanRent()
        {
            var specification = this._hasReachedMax.Not().And(this._active.Not());
            return specification.IsSatisfiedBy(this);
        }
    } 

    public class HasReachedMaxSpecification : CompositeSpecification<Customer>
    {
        public override bool IsSatisfiedBy(Customer entity)
        {
            return entity.TotalRentNumber >= 6;
        }
    }
    public class CustomerActiveSpecification : CompositeSpecification<Customer>
    {
        public override bool IsSatisfiedBy(Customer entity)
        {
            return entity.Active;
        }
    }
    /// <summary>
    /// 组合规约
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public abstract class CompositeSpecification<T> : ISpecification<T>
    { 

        public abstract bool IsSatisfiedBy(T entity); 

        public ISpecification<T> And(ISpecification<T> specification)
        {
            return new AndSpecification<T>(this, specification);
        } 

        public ISpecification<T> Not()
        {
            return new NotSpecification<T>(this);
        } 

        public ISpecification<T> Or(ISpecification<T> specification)
        {
            throw new NotImplementedException();
        } 

    } 

    public class AndSpecification<T> : CompositeSpecification<T>
    {
        private ISpecification<T> _left;
        private ISpecification<T> _right;
        public AndSpecification(ISpecification<T> left, ISpecification<T> right)
        {
            this._left = left;
            this._right = right;
        }
        public override bool IsSatisfiedBy(T entity)
        {
            return this._left.IsSatisfiedBy(entity) && this._right.IsSatisfiedBy(entity);
        }
    } 

    public class OrSpecification<T> : CompositeSpecification<T>
    {
        private ISpecification<T> _left;
        private ISpecification<T> _right;
        public OrSpecification(ISpecification<T> left, ISpecification<T> right)
        {
            this._left = left;
            this._right = right;
        }
        public override bool IsSatisfiedBy(T entity)
        {
            return this._left.IsSatisfiedBy(entity) || this._right.IsSatisfiedBy(entity);
        }
    } 

    public class NotSpecification<T> : CompositeSpecification<T>
    {
        private ISpecification<T> _inner;
        public NotSpecification(ISpecification<T> inner)
        {
            this._inner = inner;
        }
        public override bool IsSatisfiedBy(T entity)
        {
            return !this._inner.IsSatisfiedBy(entity);
        }
    }
}

本文出自 “突破中的IT结构师” 博客,请务必保留此出处http://virusswb.blog.51cto.com/115214/1020667

查看本栏目更多精彩内容:http://www.bianceng.cn/Programming/csharp/

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索return
, this
, entity
, 101规约
, 103规约
, public
, specification
, right
specification模式
规约模式、设计规约、前台web设计规约、645规约c程序、电能表通讯规约 c代码,以便于您获取更多的相关知识。

时间: 2024-09-17 04:07:57

设计模式之规约模式C#版的相关文章

《设计模式解析(第2版•修订版)》目录—导读

作者简介 设计模式解析(第2版•修订版) Alan Shalloway 美国Net Objectives咨询/培训公司的创始人和CEO.他是麻省理工学院的计算机科学硕士,具有30多年面向对象咨询.培训和软件开发的经验,并经常受邀在重要的软件开发会议(包括SD Expro.Java One.OOP和OOPSLA)上演讲. James R. Trott 美国一家大型金融机构的资深顾问.他是应用数学科学硕士.MBA和跨文化研究硕士.在其20年的职业生涯中,他一直将面向对象和基于模式的分析技术运用在知识

《设计模式解析(第2版•修订版)》—第1章 1.6节面向对象范型

1.6 面向对象范型 设计模式解析(第2版•修订版) 使用对象将责任转移到更局部的层次 面向对象范型以对象概念为中心,一切都集中在对象上.编写代码时是围绕对象而非函数进行组织的. 对象是什么?对象传统上被定义为带有方法(面向对象领域称呼函数的术语)的数据.糟糕的是,这是一种非常有局限性的对象观.稍后我会给出一个更好的对象定义(在第8章中还会谈到).我说到对象的数据时,可能指数值和字符串这样的简单事物,也可能指其他对象. 使用对象的优点在于,可以定义自己负责自己的事物(参见表1-2).对象天生就知

《设计模式解析(第2版•修订版)》—第1章 1.5节应对需求变更

1.5 应对需求变更设计模式解析(第2版•修订版)日常生活中人们如何做事? 为了找出解决需求变更问题的办法,弄清功能分解有没有其他替代方法,我们先来看看日常生活中人们是如何做事的.假设你是要在一个会议1上担任讲师,听课的人在课后还要去听其他课,但他们不知道下一堂课的听课地点.你的责任之一,就是确保大家都知道下一堂课去哪里上. 如果按照结构化程序设计的方法,可以按以下的要求做. 1.获得听课人的名单. 2.对于名单上的每个人,做以下工作. a.找到他或者她要听的下一堂课. b.找到该课的听课地点.

[Head First设计模式]云南米线馆中的设计模式——模版方法模式

系列文章 [Head First设计模式]山西面馆中的设计模式--装饰者模式 [Head First设计模式]山西面馆中的设计模式--观察者模式 [Head First设计模式]山西面馆中的设计模式--建造者模式 [Head First设计模式]饺子馆(冬至)中的设计模式--工厂模式 [Head First设计模式]一个人的平安夜--单例模式 [Head First设计模式]抢票中的设计模式--代理模式 [Head First设计模式]面向对象的3特征5原则 [Head First设计模式]鸭子

设计模式之访问者模式

        刚刚学完设计模式的访问者模式(编译器模式),这里就对该模式进行了总结与分析. 一.产生原因         这里存在一个这样的问题:如果某系统已经完成了一个类层次并提供了满足需求的所有接口,现在要增加新的需求,我们需要怎么做?         可能你会采用增加该需求并把整个层次结构统统修改一遍.然而如果需求变动会不停的发生,而且需求的任何变动都会让整个结构统统修改一遍,此时你会怎么做呢?        所以,我们现在需要对这个系统结构进行重构,访问者模式也许就是你解决上面问题最好

java设计模式---prototype(原型)模式

设计 java设计模式---prototype(原型)模式 定义:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.      Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节,      工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求      原型对象拷贝它们自己来实施创建.      适用性:当要实例化的类是在运行时刻指定时,例如,通过动态装载:或者  为了避免创建一个与产品类层次平行的工厂类层

PHP设计模式之迭代器模式

迭代器:迭代器设计模式可帮助构造特定对象, 那些对象能够提供单一标准接口循环或迭代任何类型的可计数数据. 处理需要遍历的可计数数据时, 最佳的解决办法是创建一个基于迭代器设计模式的对象. <?php    class CD {                public $band  = "";        public $title = "";        public $trackList = array();                publi

浅谈Java设计模式关于原型模式(Prototype)思索建议

java教程:关于Java设计模式关于原型模式(Prototype) IT信息技术http://www.52ij.com/jishu/ 首先需要弄清楚什么叫原型模式,或者说为什么要有原型模式,运用它会给我们带来什么或能解决什么问题?原型模式(Prototype)同抽象工厂模式同属于创建型模式,它主要关注于大量相同或相似对象的创建问题,应用原型模式就是先需要一个原对象,然后通过对原对象进行复制(克隆),来产生一个与原对象相同或相似的新对象.注意这里所说的对象相同不是指复制出来的副本对象与原对象是同

php设计模式之命令模式使用示例

 这篇文章主要介绍了php设计模式之命令模式使用示例,命令模式将一个请求封装为一个对象,从而你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤销操作 命令类: 1.命令角色:声明了一个给所有具体命令类的抽象接口.这是一个抽象角色. 2.具体命令角色:定义一个接受者和行为之间的弱耦合:实现execute方法,负责调用接受的相应操作.execute()方法通常叫做执行方法 3.客户角色:创建一个具体命令对象并确定其接受者. 4.请求者角色:负责调用命令对象执行请求,相关的方法叫