澳门新葡萄京app下载:组合模式的一个例子_php实例_脚本之家,NET架构设计

复制代码 代码如下: using System; using
System.Collections.Generic; using System.Linq; using System.Text;
namespace Test { class Program { static void Main { var customer = new
Customer { IsActive = true, LateFees = 100M, TotalRentNumber = 10 };
Console.WriteLine; Console.ReadKey(); } } public interface
ISpecification { /// /// 是不是足以租下 /// bool IsSatisfiedBy; /// ///
与操作 /// ISpecification And(ISpecification other); /// /// 否操作 ///
ISpecification Not(); } /// /// 基类 /// public abstract class
CompositeSpecification : ISpecification { public abstract bool
IsSatisfiedBy; public ISpecification And(ISpecification other) { return
new AndSpecification; } public ISpecification Not() { return new
NotSpecification; } } /// /// 与操作 /// public class AndSpecification :
CompositeSpecification { private ISpecification leftSpecification;
private ISpecification rightSpecification; public
AndSpecification(ISpecification leftSpecification, ISpecification
rightSpecification) { this.leftSpecification = leftSpecification;
this.rightSpecification = rightSpecification; } public override bool
IsSatisfiedBy { return leftSpecification.IsSatisfiedBy &&
rightSpecification.IsSatisfiedBy; } } /// ///否操作 /// public class
NotSpecification : CompositeSpecification { private ISpecification
innerSpecification; public NotSpecification(ISpecification
innerSpecification) { this.innerSpecification = innerSpecification; }
public override bool IsSatisfiedBy { return
!innerSpecification.IsSatisfiedBy; } } /// /// 是不是到达最大的鲜明租借数
/// public class HasReached马克斯Specification : CompositeSpecification {
public override bool IsSatisfiedBy { return entity.TotalRentNumber >
5; } } /// /// 是或不是激活 /// public class CustomerActiveSpecification :
CompositeSpecification { public override bool IsSatisfiedBy { return
entity.IsActive; } } /// /// 是或不是欠费 /// public class
CustomerHasLateFeesSpecification : CompositeSpecification { public
override bool IsSatisfiedBy { return entity.LateFees > 0; } } public
class Customer { private ISpecification hasReachedRentalThreshold;
private ISpecification customerIsActive; private ISpecification
customerHasLateFees; public Customer() { hasReachedRentalThreshold = new
HasReached马克斯Specification(); customerIsActive = new
CustomerActiveSpecification(); customerHasLateFees = new
CustomerHasLateFeesSpecification(); } /// /// 顾客租售mp3数量 /// public
int TotalRentNumber { get; set; } /// /// 账户是还是不是激活 /// public bool
IsActive { get; set; } /// /// 顾客在此之前是不是还欠费 /// public decimal
LateFees { get; set; } public bool CanRent() { ISpecification canRent =
customerIsActive.And(hasReachedRentalThreshold.Not.And(customerHasLateFees.Not;
return canRent.IsSatisfiedBy; } } }

走向.NET架构划杜撰计—第五章—业务层格局,原则,实行(前篇卡塔 尔(英语:State of Qatar)

  前言:不管是GOF的23种设计形式,依旧Flower的商家架构形式,相信广大的恋人知道照旧听他们说过。在这里些很特出的书中,对格局都做了很深邃的解说,本篇的意在看看这个形式如何采取在项目中的,何况付诸一些代码的例证,小洋也期待大家能够真正的明白这几个方式的沉思,而不只停留在代码结谈判外界上。

  

本篇的议题如下:

架构情势

设计形式

设计条件

 

  

  在上风流罗曼蒂克章中,我们描述了有关业务层分层的大器晚成对学问,上边我们就来看看,在实际的业务层的宏图中,大家得以应用什么格局能够将业务层设计的愈加的利落!

 

  架构格局

  首先我们就来探问,怎么着越发管用的组织业务法则。

 

  Specification 帕特tern(供给原则情势)

 

  那个情势的应用方法便是:把业务准则放在业务类的外部,并且封装成为叁个个回去boolean值的算法。那么些叁个个的事情法规的算法不仅便于管理和保卫安全,况且还能被选定,况兼很有益的组织改为复杂的业务逻辑。

 

  上边大家就来看一个以在线租mp3的商城的例证。例子超轻松,场景也很简短:判定八个客商是不是足以租越来越多的VCD。下边正是大家规划的二个主导的类图。(咱们一定认为后生可畏上来就看类图有一些突兀,未有一步步的分析,其实自身是想让大家清楚,所讲的是个怎么着事物规范,之后我们再慢慢的明亮卡塔 尔(阿拉伯语:قطر‎

 

澳门新葡萄京app下载 1

  上边大家就起来做那一个业务:

 public interface ISpecification<T>
    {
        bool IsSatisfiedBy(T entity); 
    }

    public class HasReachedMaxSpecification : ISpecification<Customer>
{
        public bool IsSatisfiedBy(Customer entity)
        {
            return entity.TotalRentNumber > 5;
        }
}

 

   上边的代码,其实正是把三个个的事务规则抽象出来了。大家知晓,在系统中,不管专业准则多么繁缛,最终在进展业务逻辑剖断的时候,最后的结果照旧“是否由此”。所以在那地就进展了画个饼来解除饥饿。

 

  因为我们的例证是以多个在线租售DVD为例子,客户能够来租售mp5,个中也有确定的规行矩步的,比如,要是客户已经租了3盘VCD,那么我们就能够设想,这一个顾客时候还足以延续租DVD。至于依据什么推断:也许VCD集团规定一位最多不能够超过5盘,或许mp5公司以为有些顾客的名誉不佳等等。 

  上面大家就来定义个具体的事务法则:HasReachedRentalThresholdSpecification

  依照那几个法则就决定二个客户是还是不是足以租VCD。   

 

澳门新葡萄京app下载 2澳门新葡萄京app下载 3代码

 public class HasReachedRentalThresholdSpecification : ISpecification<CustomerAccount> 
    {
        public override bool IsSatisfiedBy(CustomerAccount candidate)
        {       
            return candidate.NumberOfRentalsThisMonth >= 5;        
        }
    }

  

  这么些准绳定义出来后,大家就在事情类中使用那一个准绳:    

 

澳门新葡萄京app下载 4澳门新葡萄京app下载 5代码

public class Customer

{

        private ISpecification<Customer> specification = null;

        public Customer()

      {

            specification = new HasReachedMaxSpecification();

        }

 

        public int TotalRentNumber { get; set; }

 

        public bool CanRent()

        {

            return !specification.IsSatisfiedBy(this);

        }

}

  

  当然,我们能够把更加的多的事体准则组合进来。

  那么些事例到那边就完了,这些事例中只是简短的采取了Specifiction形式。不过其实的处境频频是还未那些简单的,因为贰个作业逻辑往往要结合三个多个事情法则。上边我们就来一发的看:假若应用链式的组织来达成复杂的事务逻辑。

 

  Composite Pattern(组合方式卡塔 尔(英语:State of Qatar)

  :这几个情势不归属架构情势,况兼GOF形式的大器晚成种,这里列出来首假如为着非常在此以前的**Specification模式**的,我们不用在那地融入这几个题目J

 

  Composite方式允许把二个集结对象充当单个的对象来利用,而且大家还能在这些所谓的”单个对象”中连连的嵌套。采纳这种情势,能够把对象的层级关系构成成为“树形”的结构!笔者个人喜好把它称为“容器方式”。

 

  其实这么些方式在大家在平时的ASP.NET可能WinForm ,WPF中到处可以知道。比方三个Panel控件,能够在内部加入另三个Panel,然后在Panel中得以参加GroupBox,然后再GroupBox中还足以投入Button等控件。那便是.NET Framework设计中行使了Compiste格局的例证。

 

  上面来会见Compiste格局的UML结构图:

  

 

澳门新葡萄京app下载 6

  

  在上边的图中:

  1. Component是三个抽象类,那些类提供了叁个Add方法,那些Add能够投入其它的Component.咱们想一想,那样是或不是就足以非常轻便的落到实处链式的法力。

  2. Leaf正是一个连任Component的具体类。

 

来看下面图,其实大家也能够思索在ASP.NET页面的生命周期中随处都以这种例子:举个例子在ASP.NET页面包车型地铁Init事件中,因为Page自己就是叁个器皿,那个容器里面满含了超多的别的的控件,如Panel,Button,何况Panel里面恐怕控件。那么在Init方法就能调用自己的子容器的Init方法,然后子容器在调用自个儿的子容器的Init方法,那样就少有调用,直到最后调用到有个别控件的Init的主意。那样那么些页面包车型大巴起首化就到位了。和方面包车型客车UML的布局是平等的。

 

下边大家依旧来看一个事例吗。继续以前的Specification格局的斟酌,看看假使构成则二种方式来协会复杂的事务逻辑。

为了使得例子有一点说性格很顽强在困苦劳苦或巨大压力面前不屈力,我们把前边的政工稍稍的变复杂一丢丢:为了认清三个顾客是不是能够租VCD,大家要开展风姿浪漫雨后春笋的平整判别之后技术垄断结果:

1.    客户的账号是或不是处在激活的景况

2.    顾客以前是或不是还欠费

3.    客户租费mp3的多寡是还是不是达到规定的标准了规定的数据

  上面首先总体来寻访一些类图的组织:

澳门新葡萄京app下载,  

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

CopyRight © 2015-2019 澳门新葡8455手机版 All Rights Reserved.
网站地图xml地图