??xml version="1.0" encoding="utf-8" standalone="yes"?>久久国产美女免费观看精品,欧美一区二区三区久久综合 ,亚洲性久久久影院http://m.shnenglu.com/woaidongmao/category/9181.html文章均收录自他h博客Q但不喜标题前加-[转脓(chung)]Q因其丑陋,见谅Q~zh-cnMon, 22 Dec 2008 14:32:10 GMTMon, 22 Dec 2008 14:32:10 GMT60OOP늅Q接口隔d?-ISPhttp://m.shnenglu.com/woaidongmao/archive/2008/12/22/70102.html肥仔肥仔Mon, 22 Dec 2008 13:36:00 GMThttp://m.shnenglu.com/woaidongmao/archive/2008/12/22/70102.htmlhttp://m.shnenglu.com/woaidongmao/comments/70102.htmlhttp://m.shnenglu.com/woaidongmao/archive/2008/12/22/70102.html#Feedback0http://m.shnenglu.com/woaidongmao/comments/commentRss/70102.htmlhttp://m.shnenglu.com/woaidongmao/services/trackbacks/70102.htmlISP介(ISP--Interface Segregation PrincipleQ:(x)
一个类对另外一个类的依赖性应当是建立在最的接口上的?span lang="EN-US">
一个接口代表一个角Ԍ不应当将不同的角色都交给一个接口。没有关pȝ接口合ƈ在一P形成一个臃肿的大接口,q是对角色和接口的污染?span lang="EN-US">

不应该强q客户依赖于它们不用的方法。接口属于客P不属于它所在的cdơ结构?span lang="EN-US">?/span>q个说得很明白了(jin)Q再通俗点说Q不要强q客户用它们不用的Ҏ(gu)Q如果强q用户用它们不使用的方法,那么q些客户׃(x)面(f)׃q些不用的Ҏ(gu)的改变所带来的改变?span lang="EN-US">

(跟自己无?span lang="EN-US">)而被影响。拿取款来说Q它Ҏ(gu)不关?span lang="EN-US">?/span>存款操作?/span>?span lang="EN-US">?/span>转帐操作?/span>Q可是它却要受到q两个方法的变化的媄(jing)响?span lang="EN-US">

clip_image001

那么我们该如何解册个问题呢Q参考下囄设计Qؓ(f)每个c都单独设计专门的操作接口,使得它们只依赖于它们关系的方法,q样׃?x)互相?jing)?jin)?span lang="EN-US">

clip_image002

三、实现方法:(x)、用委托分L?span lang="EN-US">
2
、用多重(h)承分L?span lang="EN-US">

 



肥仔 2008-12-22 21:36 发表评论
]]>
OOP늅Q依赖倒置原则(DIP)http://m.shnenglu.com/woaidongmao/archive/2008/12/22/70101.html肥仔肥仔Mon, 22 Dec 2008 13:34:00 GMThttp://m.shnenglu.com/woaidongmao/archive/2008/12/22/70101.htmlhttp://m.shnenglu.com/woaidongmao/comments/70101.htmlhttp://m.shnenglu.com/woaidongmao/archive/2008/12/22/70101.html#Feedback0http://m.shnenglu.com/woaidongmao/comments/commentRss/70101.htmlhttp://m.shnenglu.com/woaidongmao/services/trackbacks/70101.html依赖倒置Q?span lang="EN-US">Dependence Inversion PrincipleQ原则讲的是Q要依赖于抽象,不要依赖于具体?span lang="EN-US">

单的_(d)依赖倒置原则要求客户端依赖于抽象耦合。原则表qͼ(x)phpma开?|江渔R

抽象不应当依赖于l节Q细节应当依赖于抽象Q?span lang="EN-US">
要针Ҏ(gu)口编E,不针对实现编E?span lang="EN-US">

反面例子Q?span lang="EN-US">

 clip_image001

~点Q耦合太紧密,Light发生变化媄(jing)?span lang="EN-US">ToggleSwitch?span lang="EN-US">

解决办法一Q?span lang="EN-US">
?span lang="EN-US">Light作成AbstractQ然后具体类l承?span lang="EN-US">Light?span lang="EN-US">
 clip_image002

优点Q?span lang="EN-US">ToggleSwitch依赖于抽象类LightQ具有更高的E_性,?span lang="EN-US">BulbLight?span lang="EN-US">TubeLightl承?span lang="EN-US">LightQ可以根?span lang="EN-US">"开放-闭"原则q行扩展。只?span lang="EN-US">Light不发生变化,BulbLight?span lang="EN-US">TubeLight的变化就不会(x)波及(qing)ToggleSwitch?span lang="EN-US">

~点Q如果用ToggleSwitch控制一台电(sh)视就很困难了(jin)。M能让TVl承?span lang="EN-US">Light吧?span lang="EN-US">

解决Ҏ(gu)二:(x)
 clip_image003

优点Q更为通用、更为稳定?span lang="EN-US">

l论Q?span lang="EN-US">
使用传统q程化程序设计所创徏的依赖关p,{略依赖于细节,q是p糕的,因ؓ(f){略受到l节改变的媄(jing)响。依赖倒置原则使细节和{略都依赖于抽象Q抽象的E_性决定了(jin)pȝ的稳定性?span lang="EN-US">

 



肥仔 2008-12-22 21:34 发表评论
]]>
OOP늅QLiskov替换原则--LSPhttp://m.shnenglu.com/woaidongmao/archive/2008/12/22/70100.html肥仔肥仔Mon, 22 Dec 2008 13:32:00 GMThttp://m.shnenglu.com/woaidongmao/archive/2008/12/22/70100.htmlhttp://m.shnenglu.com/woaidongmao/comments/70100.htmlhttp://m.shnenglu.com/woaidongmao/archive/2008/12/22/70100.html#Feedback0http://m.shnenglu.com/woaidongmao/comments/commentRss/70100.htmlhttp://m.shnenglu.com/woaidongmao/services/trackbacks/70100.htmlLSP介(LSP--Liskov Substitution PrincipleQ:(x)

定义Q如果对于类?span lang="EN-US">S的每一个对?span lang="EN-US">o1Q都有一个类?span lang="EN-US">T的对?span lang="EN-US">o2Q对于L用类?span lang="EN-US">T定义的程?span lang="EN-US">PQ将o2替换?span lang="EN-US">o1Q?span lang="EN-US">P的行Z持不变,则称S?span lang="EN-US">T的一个子cd?/font>
子类型必能够替换它的基cd?span lang="EN-US">LSP又称里氏替换原则?/font>
对于q个原则Q通俗一些的理解是Q父cȝҎ(gu)都要在子cM实现或者重写?/font>
 
二、D例说明:(x)
对于依赖倒置原则Q说的是父类不能依赖子类Q它们都要依赖抽象类。这U依赖是我们实现代码扩展和运行期内绑定(多态)(j)的基。因Z旦类的用者依赖某个具体的c,那么对该依赖的扩展就无从谈vQ而依赖某个抽象类Q则只要实现?jin)该抽象cȝ子类Q都可以被类的用者用,从而实C(jin)pȝ的扩展?/font>开?/span>但是Q光有依赖倒置原则Qƈ不一定就使我们的代码真正h良好的扩展性和q行期内l定。请看下面的代码Q?/font>
public class Animal
{
    private string name;
    public Animal(string name)
    {
        this.name = name;
    }
    public void Description()
    {
        Console.WriteLine("This is a(an) " + name);
    }
}
 
//
下面是它的子cȝc:(x)
开?/span>public class Cat : Animal
{
    public Cat(string name)
    {
       
    }
    public void Mew()
    {
        Console.WriteLine("The cat is saying like 'mew'");
    }
}
 
//
开?/span>public class Dog : Animal
{
    public Dog(string name)
    {
 
    }
    public void Bark()
    {
        Console.WriteLine("The dog is saying like 'bark'");
    }
}

 

//最后,我们来看客户端的调用Q?/font>
public void DecriptionTheAnimal(Animal animal)
{
    if (typeof(animal) is Cat)
    {
        Cat cat = (Cat)animal;
        Cat.Decription();
        Cat.Mew();
    }
    else if (typeof(animal) is Dog)
    {
        Dog dog = (Dog)animal;
        Dog.Decription();
        Dog.Bark();
    }
}
通过上面的代码,我们可以看到虽然客户端的依赖是对抽象的依赖,但依然这个设计的扩展性不好,q行期绑定没有实现?/font>
开?/span>是什么原因呢Q其实就是因Z满里氏替换原则Q子cdCat?span lang="EN-US">Mew()Ҏ(gu)父类Ҏ(gu)没有Q?span lang="EN-US">DogcLBark()Ҏ(gu)父类也没有,两个子类都不能替换父cR这样导致了(jin)pȝ的扩展性不好和没有实现q行期内l定?/font>
现在看来Q一个系l或子系l要拥有良好的扩展性和实现q行期内l定Q有两个必要条gQ第一是依赖倒置原则Q第二是里氏替换原则。这两个原则~Z不可?/font>
 
我们知道Q在我们的大多数的模式中Q我们都有一个共同的接口Q然后子cd扩展c都d现该接口?/font>
下面是一D原始代码:(x)
if(action.Equals(“add?)
{
  //do add action
}
else if(action.Equals(“view?)
{
  //do view action
}
else if(action.Equals(“delete?)
{
  //do delete action
}
else if(action.Equals(“modify?)
{
  //do modify action
}
我们首先惛_的是把这些动作分d来,可能写出如下的代码Q?/font>开?/span>public class AddAction
{
    public void add()
    {
        //do add action
    }
}
public class ViewAction
{
    public void view()
    {
        //do view action
    }
}
public class deleteAction
{
    public void delete()
    {
        //do delete action
    }
}
public class ModifyAction
{
    public void modify()
    {
        //do modify action
    }
}
开?/span>下面我们来看看命令模式对该问题的解决Ҏ(gu)Q?/font>
public interface Action
{
    public void doAction();
}
//
然后是各个实玎ͼ(x)
public class AddAction : Action
{
    public void doAction()
    {
        //do add action
    }
}
public class ViewAction : Action
{
    public void doAction()
    {
        //do view action
    }
}
public class deleteAction : Action
{
    public void doAction()
    {
        //do delete action
    }
}
public class ModifyAction : Action
{
    public void doAction()
    {
        //do modify action
    }
}
//
q样Q客L(fng)的调用大概如下:(x)
public void execute(Action action)
{
    action.doAction();
}
看,上面的客L(fng)代码再也没有出现q?span lang="EN-US">typeof
q样的语句,扩展性良好,也有?jin)运行期内绑定的优点?

 

三?span lang="EN-US">LSP优点Q?/font>
1
、保证系l或子系l有良好的扩展性。只有子c能够完全替换父c,才能保证pȝ或子pȝ在运行期内识别子cd可以?jin),因而得系l或子系l有?jin)良好的扩展性?/font>
2
、实现运行期内绑定,即保证了(jin)面向对象多态性的利q行。这节省?jin)大量的代码重复或冗余。避免了(jin)cMinstanceofq样的语句,或?span lang="EN-US">getClass()q样的语句,q些语句是面向对象所忌讳的?/font>
3
、有利于实现契约式编E。契U式~程有利于系l的分析和设计,指我们在分析和设计的时候,定义好系l的接口Q然后再~码的时候实现这些接口即可。在父类里定义好子类需要实现的功能Q而子cd要实现这些功能即可?/font>
 
四、?span lang="EN-US">LSP注意点:(x)
1
、此原则?span lang="EN-US">OCP的作用有点类|其实q些面向对象的基本原则就2条:(x)1Q面向接口编E,而不是面向实玎ͼ2Q用l合而不d用(h)?/font>
2
?span lang="EN-US">LSP是保?span lang="EN-US">OCP的重要原?/font>
3
、这些基本的原则在实现方法上也有个共同层ơ,是使用中间接口层,以此来达到类对象的低偶合Q也是抽象偶合Q?/font>
4
、派生类的退化函敎ͼ(x)zcȝ某些函数退化(变得没有用处Q,Base的用者不知道不能调用fQ会(x)D替换q规。在zcM存在退化函数ƈ不L表示q反?span lang="EN-US">LSPQ但是当存在q种情况Ӟ应该引v注意?/font>
5
、从zcL出异常:(x)如果在派生类的方法中d?jin)其基类不?x)抛出的异常。如果基cȝ使用者不期望q些异常Q那么把他们d到派生类的方法中可以能?x)导致不可替换性?span lang="EN-US">



肥仔 2008-12-22 21:32 发表评论
]]>
OOP늅Q单一职责原则--SRPhttp://m.shnenglu.com/woaidongmao/archive/2008/12/22/70098.html肥仔肥仔Mon, 22 Dec 2008 13:29:00 GMThttp://m.shnenglu.com/woaidongmao/archive/2008/12/22/70098.htmlhttp://m.shnenglu.com/woaidongmao/comments/70098.htmlhttp://m.shnenglu.com/woaidongmao/archive/2008/12/22/70098.html#Feedback0http://m.shnenglu.com/woaidongmao/comments/commentRss/70098.htmlhttp://m.shnenglu.com/woaidongmao/services/trackbacks/70098.htmlSRP介(SRP--Single-Responsibility PrincipleQ:(x)开?span lang="EN-US">com所谓职责,我们可以理解他ؓ(f)功能Q就是设计的q个cd能应该只有一个,而不是两个或更多。也可以理解为引用变化的原因Q当你发现有两个变化?x)要求我们修改这个类Q那么你p考虑撤分q个cM(jin)。因责是变化的一个uU,当需求变化时Q该变化?x)反映类的职责的变?/span>像一个hw兼数职Q而这些事情相互关联不大,Q甚x(chng)冲突Q那他就无法很好的解册些职责,应该分到不同的hw上d才对?span lang="EN-US">?/span>SRP原则代码: 开?span lang="EN-US">com接口明显h两个职责Q连接管理和数据通讯Q?span lang="EN-US">

SRP优点Q?/span>开?span lang="EN-US">com

SRP注意点:(x)、一个合理的c,应该仅有一个引起它变化的原因,卛_一职责Q?span lang="EN-US">
2
、在没有变化征兆的情况下应用SRP或其他原则是不明智的Q?span lang="EN-US">
3
、在需求实际发生变化时应该应?span lang="EN-US">SRP{原则来重构代码Q?span lang="EN-US">
4、用测试驱动开发会(x)q我们在设计出现臭味之前分M合理代码Q?span lang="EN-US">
5、如果测试不能迫使职责分,僵化性和脆弱性的臭味?x)变得很强烈Q那应该用Facade?span lang="EN-US">Proxy模式对代码重构;

 



肥仔 2008-12-22 21:29 发表评论
]]>
OOP늅Q开攑ְ闭原?-OCPhttp://m.shnenglu.com/woaidongmao/archive/2008/12/22/70097.html肥仔肥仔Mon, 22 Dec 2008 13:27:00 GMThttp://m.shnenglu.com/woaidongmao/archive/2008/12/22/70097.htmlhttp://m.shnenglu.com/woaidongmao/comments/70097.htmlhttp://m.shnenglu.com/woaidongmao/archive/2008/12/22/70097.html#Feedback0http://m.shnenglu.com/woaidongmao/comments/commentRss/70097.htmlhttp://m.shnenglu.com/woaidongmao/services/trackbacks/70097.html一?span lang="EN-US">OCP介(OCP--Open-Closed PrincipleQ:(x)
Software entities(classes,modules,functions,etc.) should be open for extension, but closed for modification
?span lang="EN-US">
软g实体应当Ҏ(gu)展开放,对修改关闭,卌Y件实体应当在不修改(?span lang="EN-US">.Net当中可能通过代理模式来达到这个目的)(j)的前提下扩展?span lang="EN-US">
Open for extension:当新需求出现的时候,可以通过扩展现有模型辑ֈ目的?span lang="EN-US">   
Close for modification:对已有的二进制代码,?span lang="EN-US">dll,jar{,则不允许做Q何修攏V?span lang="EN-US">
    
二?span lang="EN-US">OCP举例Q?/b>
1
、例子一
假如我们要写一个工资税c,工资E在不同国家有不同计规则,如果我们不坚?span lang="EN-US">OCPQ直接写一个类装工资E的税Ҏ(gu)Q而每个国家对工资E的具体实现l节是不相同的Q如果我们允怿改,x(chng)现在pȝ需要的所有工资税Q中国工资税、美国工资税{)(j)都放在一个类里实玎ͼ谁也不能保证未来pȝ不会(x)被卖到日本,一旦出现新的工资税Q而在软g中必要实现q种工资E,q个时候我们能做的只有扑ևq个cLӞ在每个方法里加上日本E的实现l节q新编译成DLLQ虽然在.NET的运行环境中Q我们只要将新的DLL覆盖到原有的DLL卛_Qƈ不媄(jing)响现有程序的正常q行Q但每次出现新情况都要找出类文gQ添加新的实现细节,q个cL件不断扩大,以后l护h变的越来越困难Q也q不满我们以前说的单一职责原则Q?span lang="EN-US">SRPQ,因ؓ(f)不同国家的工资税变化都会(x)引v对这个类的改变动机!如果我们在设计这个类的时候坚持了(jin)OCP的话Q把工资E的公共Ҏ(gu)抽象出来做成一个接口,闭修改Q在客户?span lang="EN-US">(使用该接口的cd?span lang="EN-US">)只依赖这个接口来实现对自己所需要的工资E,以后如果pȝ需要增加新的工资税Q只要扩展一个具体国家的工资E实现我们先前定义的接口Q就可以正常使用Q而不必重C改原有类文gQ?span lang="EN-US">
 
2、例子二
下面q个例子是既不开放也不封闭的Q因?span lang="EN-US">Client?span lang="EN-US">Server都是具体c,如果我要Client使用不同的一?span lang="EN-US">Serverc那p修改ClientcM所有?span lang="EN-US">Servercȝ地方为新?span lang="EN-US">ServercR?span lang="EN-US">

class Client
{
   Server server;
   void GetMessage()
   {
      server.Message();
   }
}
 
class Server
{
   void Message();
}
 


下面Z改后W合OCP原则的实玎ͼ我们看到ServercL?span lang="EN-US">ClientInterfacel承的,不过ClientInterface却不?span lang="EN-US">ServerInterfaceQ原因是我们希望?span lang="EN-US">Client来说ClientInterface是固定下来的Q变化的只是Server。这实际上就变成?jin)一U策略模?span lang="EN-US">(Gof StrategyQ?span lang="EN-US">


interface ClientInterface
{
    public void Message();
    //Other functions
}
 
class Server:ClientInterface
{
    public void Message();
}
 
class Client
{
   ClientInterface ci;
   public void GetMessage()
   {
       ci.Message();
   }
   public void Client(ClientInterface paramCi)
   {
       ci=paramCi;
   }
}
 
//
那么在主函数(或主控端)?span lang="EN-US">
public static void Main()
{
   ClientInterface ci = new Server();
   //
在上面如果有新的Servercd要替?span lang="EN-US">Server()p?jin)?span lang="EN-US">
   Client client = new Client(ci);
   client.GetMessage();
}
 

、例子三
使用Template Method实现OCPQ?span lang="EN-US">
public abstract class Policy
{
    private int[] i ={ 1, 1234, 1234, 1234, 132 };
    public bool Sort()
    {
        SortImp();
    }
    protected virtual bool SortImp()
    {
 
    }
}
 
class Bubbleimp : Policy
{
    protected override bool SortImp()
    {
        //
冒(chng)排序
    }
}
class Bintreeimp : Policy
{
    protected override bool SortImp()
    {
        //
二分法排?span lang="EN-US">
    }
}
 
//dC实现
static void Main(string[] args)
{
    //
如果要用冒泡排序,只要把下面的Bintreeimp改ؓ(f)Bubbleimp
    Policy sort = new Bintreeimp();
    sort.Sort();
}
 
三?span lang="EN-US">OCP优点Q?/b>
1
、降低程序各部分之间的耦合性,使程序模块互换成为可能;
2
、软g各部分便于单元测试,通过~制与接口一致的模拟c(MockQ,可以很容易地实现软g各部分的单元试Q?span lang="EN-US">
3、利于实现Y件的模块的呼唤,软g升时可以只部v发生变化的部分,而不?x)?jing)响其它部分;
 
四、?span lang="EN-US">OCP注意点:(x)
1
、实?span lang="EN-US">OCP原则的关键是抽象Q?span lang="EN-US">
2、两U安全的实现开闭原则的设计模式是:(x)Strategy patternQ策略模式)(j)Q?span lang="EN-US">Template MethordQ模版方法模式)(j)Q?span lang="EN-US">
3、依据开闭原?span lang="EN-US">,我们量不要修改c?span lang="EN-US">,只扩展类,但在有些情况下会(x)出现一些比较怪异的状况,q时可以采用几个c进行组合来完成Q?span lang="EN-US">
4、将可能发生变化的部分封装成一个对?span lang="EN-US">,?span lang="EN-US">: 状?span lang="EN-US">, 消息,,,数据l构{等 , 装变化是实?span lang="EN-US">"开闭原?span lang="EN-US">"的一个重要手D,如经常发生变化的状态?span lang="EN-US">,如温?span lang="EN-US">,气压,颜色,U分,排名{等,可以这些作为独立的属?span lang="EN-US">,如果参数之间有关p?span lang="EN-US">,有必要进行抽象。对于行?span lang="EN-US">,如果是基本不变的,则可以直接作为对象的Ҏ(gu),否则考虑抽象或者封装这些行为;
5
、在许多斚wQ?span lang="EN-US">OCP是面向对象设计的核心(j)所在。遵循这个原则可带来面向对象技术所声称的巨大好处(灉|性、可重用性以?qing)可l护性)(j)。然而,对于应用E序的每个部分都肆意地进行抽象ƈ不是一个好L。应该仅仅对E序中呈现出频繁变化的那部分作出抽象。拒l不成熟的抽象和抽象本n一样重要;



肥仔 2008-12-22 21:27 发表评论
]]>
OOP之五大原?/title><link>http://m.shnenglu.com/woaidongmao/archive/2008/12/22/70096.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Mon, 22 Dec 2008 13:19:00 GMT</pubDate><guid>http://m.shnenglu.com/woaidongmao/archive/2008/12/22/70096.html</guid><wfw:comment>http://m.shnenglu.com/woaidongmao/comments/70096.html</wfw:comment><comments>http://m.shnenglu.com/woaidongmao/archive/2008/12/22/70096.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/woaidongmao/comments/commentRss/70096.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/woaidongmao/services/trackbacks/70096.html</trackback:ping><description><![CDATA[<p></p> <p class="MsoNormal" style="line-height: 150%; text-align: left; mso-pagination: widow-orphan; mso-outline-level: 1" align="left"><b><span style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 18.0pt; mso-bidi-font-family: ?hu)?>基本原则<span lang="EN-US"> <?xml:namespace prefix = o /><o:p></o:p></span></span></b></p> <p class="MsoNormal" style="margin-left: 27pt; vertical-align: middle; text-indent: -18pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan; mso-list: l1 level1 lfo1; tab-stops: list 36.0pt" align="left"><span lang="EN-US" style="font-size: 10pt; line-height: 150%; font-family: symbol; mso-font-kerning: 0pt; mso-bidi-font-family: symbol; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: symbol"><span style="mso-list: ignore">·<span style="font: 7pt 'Times New Roman'">               </span></span></span><span style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>装变化<span lang="EN-US">Encapsulate what varies. <o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-left: 27pt; vertical-align: middle; text-indent: -18pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan; mso-list: l1 level1 lfo1; tab-stops: list 36.0pt" align="left"><span lang="EN-US" style="font-size: 10pt; line-height: 150%; font-family: symbol; mso-font-kerning: 0pt; mso-bidi-font-family: symbol; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: symbol"><span style="mso-list: ignore">·<span style="font: 7pt 'Times New Roman'">               </span></span></span><span style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>面向接口变成而不是实?span lang="EN-US"> Code to an interface rather than to an implementation. <o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-left: 27pt; vertical-align: middle; text-indent: -18pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan; mso-list: l1 level1 lfo1; tab-stops: list 36.0pt" align="left"><span lang="EN-US" style="font-size: 10pt; line-height: 150%; font-family: symbol; mso-font-kerning: 0pt; mso-bidi-font-family: symbol; mso-bidi-font-size: 12.0pt; mso-fareast-font-family: symbol"><span style="mso-list: ignore">·<span style="font: 7pt 'Times New Roman'">               </span></span></span><span style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>优先使用l合而非l承 </span><span lang="EN-US" style="font-size: 12pt; color: black; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: arial">Favor Composition Over Inheritance</span><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?> <o:p></o:p></span></p> <p class="MsoNormal" style="line-height: 150%; text-align: left; mso-pagination: widow-orphan; mso-outline-level: 1" align="left"><b><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 18.0pt; mso-bidi-font-family: ?hu)?>SRP: The single responsibility principle </span></b><b><span style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 18.0pt; mso-bidi-font-family: ?hu)?>单一职责 <span lang="EN-US"><o:p></o:p></span></span></b></p> <p class="MsoNormal" style="margin-left: 27pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan" align="left"><span style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>pȝ中的每一个对象都应该只有一个单独的职责Q而所有对象所x(chng)的就是自w职责的完成?span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-left: 27pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>Every object in your system should have a single responsibility ,and all the object s services should<span style="mso-spacerun: yes">  </span>be focused on carrying out that single responsibility .<o:p></o:p></span></p> <p class="MsoNormal" style="margin-left: 27pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?> <o:p></o:p></span></p> <p class="MsoNormal" style="margin-left: 27pt; vertical-align: middle; text-indent: -18pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan; mso-list: l2 level1 lfo2; tab-stops: list 36.0pt" align="left"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?><span style="mso-list: ignore">1.<span style="font: 7pt 'Times New Roman'">          </span></span></span><span style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>每一个职责都是一个设计的变因Q需求变化的时候,需求变化反映ؓ(f)c职责的变化。当你系l里面的对象都只有一个变化的原因的时候,你就已经很好的遵循了(jin)<span lang="EN-US">SRP</span>原则?<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-left: 27pt; vertical-align: middle; text-indent: -18pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan; mso-list: l2 level1 lfo3; tab-stops: list 36.0pt" align="left"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?><span style="mso-list: ignore">2.<span style="font: 7pt 'Times New Roman'">          </span></span></span><span style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>如果一个类承担的职责过多,q于把q些职责耦合在了(jin)一赗一个职责的变化可能削弱或者抑制这个类其它职责的能力。这U设计会(x)D脆弱的设计。当变化发生的时候,设计?x)遭到意想不到的破坏?<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-left: 27pt; vertical-align: middle; text-indent: -18pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan; mso-list: l2 level1 lfo4; tab-stops: list 36.0pt" align="left"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?><span style="mso-list: ignore">3.<span style="font: 7pt 'Times New Roman'">          </span></span></span><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>SRP </span><span style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>让这个系l更Ҏ(gu)理l护Q因Z是所有的问题都搅在一赗?<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-left: 27pt; vertical-align: middle; text-indent: -18pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan; mso-list: l2 level1 lfo5; tab-stops: list 36.0pt" align="left"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?><span style="mso-list: ignore">4.<span style="font: 7pt 'Times New Roman'">          </span></span></span><span style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>内聚<span lang="EN-US">Cohesion </span>其实?span lang="EN-US">SRP</span>原则的另外一个名?span lang="EN-US">.</span>你写?jin)高内聚的Y件其实就是说你很好的应用?span lang="EN-US">SRP</span>原则?<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-left: 27pt; vertical-align: middle; text-indent: -18pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan; mso-list: l2 level1 lfo6; tab-stops: list 36.0pt" align="left"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?><span style="mso-list: ignore">5.<span style="font: 7pt 'Times New Roman'">          </span></span></span><span style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>怎么判断一个职责是不是一个对象的呢?你试着让这个对象自己来完成q个职责Q比如:(x)“书自己阅读内容”,阅读的职责显然不是书自己的?<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-left: 27pt; vertical-align: middle; text-indent: -18pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan; mso-list: l2 level1 lfo7; tab-stops: list 36.0pt" align="left"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?><span style="mso-list: ignore">6.<span style="font: 7pt 'Times New Roman'">          </span></span></span><span style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>仅当变化发生Ӟ变化的uU才h实际的意义,如果没有征兆Q那么应?span lang="EN-US">SRP</span>或者Q何其它的原则都是不明智的?<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%; text-align: left; mso-pagination: widow-orphan; mso-outline-level: 1" align="left"><b><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 18.0pt; mso-bidi-font-family: ?hu)?>DRY : Don't repeat yourself Principle <o:p></o:p></span></b></p> <p class="MsoNormal" style="margin-left: 27pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan" align="left"><span style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>通过抽取公共部分攄在一个地斚w免代码重?span lang="EN-US">.<o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-left: 27pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>Avoid duplicate code by abstracting out things that are common and placing those thing in a single location .<o:p></o:p></span></p> <p class="MsoNormal" style="margin-left: 27pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?> <o:p></o:p></span></p> <p class="MsoNormal" style="margin-left: 27pt; vertical-align: middle; text-indent: -18pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan; mso-list: l6 level1 lfo8; tab-stops: list 36.0pt" align="left"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?><span style="mso-list: ignore">1.<span style="font: 7pt 'Times New Roman'">          </span></span></span><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>DRY </span><span style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>很简单,但却是确保我们代码容易维护和复用的关键?<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-left: 27pt; vertical-align: middle; text-indent: -18pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan; mso-list: l6 level1 lfo9; tab-stops: list 36.0pt" align="left"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?><span style="mso-list: ignore">2.<span style="font: 7pt 'Times New Roman'">          </span></span></span><span style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>你尽力避免重复代码候实际上在做一件什么事情呢Q是在确保每一个需求和功能在你的系l中只实Cơ,否则存在浪费!pȝ用例不存在交集,所以我们的代码更不应该重复Q从q个角度?span lang="EN-US">DRY</span>可就不只是在说代码了(jin)?<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-left: 27pt; vertical-align: middle; text-indent: -18pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan; mso-list: l6 level1 lfo10; tab-stops: list 36.0pt" align="left"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?><span style="mso-list: ignore">3.<span style="font: 7pt 'Times New Roman'">          </span></span></span><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>DRY </span><span style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>x(chng)的是pȝ内的信息和行为都攑֜一个单一的,明显的位|。就像你可以猜到正则表达式在<span lang="EN-US">.net</span>中的位置一P因ؓ(f)合理所以可以猜到?<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-left: 27pt; vertical-align: middle; text-indent: -18pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan; mso-list: l6 level1 lfo11; tab-stops: list 36.0pt" align="left"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?><span style="mso-list: ignore">4.<span style="font: 7pt 'Times New Roman'">          </span></span></span><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>DRY </span><span style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>原则Q如何对pȝ职能q行良好的分Ԍ职责清晰的界限一定程度上保证?jin)代码的单一性?span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%; text-align: left; mso-pagination: widow-orphan; mso-outline-level: 1" align="left"><b><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 18.0pt; mso-bidi-font-family: ?hu)?>OCP : Open-Close Principle</span></b><b><span style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 18.0pt; mso-bidi-font-family: ?hu)?>开闭原?span lang="EN-US"><o:p></o:p></span></span></b></p> <p class="MsoNormal" style="margin-left: 27pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan" align="left"><span style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>cd该对修改关闭Q对扩展打开Q?span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-left: 27pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>Classes should be open for extension ,and closed<span style="mso-spacerun: yes">  </span>for modification .<o:p></o:p></span></p> <p class="MsoNormal" style="margin-left: 27pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?> <o:p></o:p></span></p> <p class="MsoNormal" style="margin-left: 27pt; vertical-align: middle; text-indent: -18pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan; mso-list: l5 level1 lfo12; tab-stops: list 36.0pt" align="left"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?><span style="mso-list: ignore">1.<span style="font: 7pt 'Times New Roman'">          </span></span></span><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>OCP </span><span style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>x(chng)的是灉|性,改动是通过增加代码q行的,而不是改动现有的代码Q?<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-left: 27pt; vertical-align: middle; text-indent: -18pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan; mso-list: l5 level1 lfo13; tab-stops: list 36.0pt" align="left"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?><span style="mso-list: ignore">2.<span style="font: 7pt 'Times New Roman'">          </span></span></span><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>OCP</span><span style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>的应用限定在可能?x)发生的变化上,通过创徏抽象来隔M后发生的同类变化 <span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-left: 27pt; vertical-align: middle; text-indent: -18pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan; mso-list: l5 level1 lfo14; tab-stops: list 36.0pt" align="left"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?><span style="mso-list: ignore">3.<span style="font: 7pt 'Times New Roman'">          </span></span></span><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>OCP</span><span style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>原则传递出来这样一个思想Q一旦你写出来了(jin)可以工作的代码,p努力保证q段代码一直可以工作。这可以说是一个底Uѝ稍微提高(sh)点要?span lang="EN-US">,</span>一旦我们的代码质量C(jin)一个水qI我们要尽最大努力保证代码质量不回退。这L(fng)要求使我们面对一个问题的时候不?x)用凑zȝҎ(gu)来解冻I或者说是放任自的方式来解决一个问题;比如代码d?jin)无数对特定数据的处理,特化的代码越来越多,代码意图开始含混不清,开始退化?<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-left: 27pt; vertical-align: middle; text-indent: -18pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan; mso-list: l5 level1 lfo15; tab-stops: list 36.0pt" align="left"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?><span style="mso-list: ignore">4.<span style="font: 7pt 'Times New Roman'">          </span></span></span><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>OCP </span><span style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>背后的机Ӟ(x)装和抽象;闭是徏立在抽象基础上的Q用抽象获得显C的闭Q(h)承是<span lang="EN-US">OCP</span>最单的例子。除?jin)子cd和方法重载我们还有一些更优雅的方法来实现比如l合Q?<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-left: 27pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan" align="left"><span style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>怎样在不改变源代码(关闭修改Q的情况下更改它的行为呢Q答案就是抽象,<span lang="EN-US">OCP</span>背后的机制就是抽象和多?span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-left: 27pt; vertical-align: middle; text-indent: -18pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan; mso-list: l3 level1 lfo16; tab-stops: list 36.0pt" align="left"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?><span style="mso-list: ignore">5.<span style="font: 7pt 'Times New Roman'">          </span></span></span><span style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>没有一个可以适应所有情늚贴切的模型!一定会(x)有变化,不可能完全封?span lang="EN-US">.</span>对程序中的每一个部分都肆意的抽象不是一个好LQ正的做法是开发h员(sh)仅对频繁变化的部分做出抽象。拒l不成熟的抽象和抽象本n一样重要?<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-left: 27pt; vertical-align: middle; text-indent: -18pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan; mso-list: l3 level1 lfo17; tab-stops: list 36.0pt" align="left"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?><span style="mso-list: ignore">6.<span style="font: 7pt 'Times New Roman'">          </span></span></span><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>OCP</span><span style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>?span lang="EN-US">OOD</span>很多说法的核?j),如果q个原则有效应用Q我们就可以h强的可维护性可重用 灉|?健壮?span lang="EN-US"> LSP</span>?span lang="EN-US">OCP</span>成ؓ(f)可能的主要原则之一 <span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%; text-align: left; mso-pagination: widow-orphan; mso-outline-level: 1" align="left"><b><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 18.0pt; mso-bidi-font-family: ?hu)?>LSP: The Liskov substitution principle <o:p></o:p></span></b></p> <p class="MsoNormal" style="margin-left: 27pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan" align="left"><span style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>子类必须能够替换基类?span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-left: 27pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>Subtypes must be substitutable<span style="mso-spacerun: yes">  </span>for their base types.<o:p></o:p></span></p> <p class="MsoNormal" style="margin-left: 27pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?> <o:p></o:p></span></p> <p class="MsoNormal" style="margin-left: 27pt; vertical-align: middle; text-indent: -18pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan; mso-list: l4 level1 lfo18; tab-stops: list 36.0pt" align="left"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?><span style="mso-list: ignore">1.<span style="font: 7pt 'Times New Roman'">          </span></span></span><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>LSP</span><span style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>x(chng)的是怎样良好的用(h)?span lang="EN-US">. <o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-left: 27pt; vertical-align: middle; text-indent: -18pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan; mso-list: l4 level1 lfo19; tab-stops: list 36.0pt" align="left"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?><span style="mso-list: ignore">2.<span style="font: 7pt 'Times New Roman'">          </span></span></span><span style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>必须要清楚是使用一?span lang="EN-US">Method</span>q是要扩展它Q但是绝对不是改变它?<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-left: 27pt; vertical-align: middle; text-indent: -18pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan; mso-list: l4 level1 lfo20; tab-stops: list 36.0pt" align="left"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?><span style="mso-list: ignore">3.<span style="font: 7pt 'Times New Roman'">          </span></span></span><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>LSP</span><span style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>清晰的指出,<span lang="EN-US">OOD</span>?span lang="EN-US">IS-A</span>关系是就行ؓ(f)方式而言Q行为方式是可以q行合理假设的,是客L(fng)序所依赖的?<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-left: 27pt; vertical-align: middle; text-indent: -18pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan; mso-list: l4 level1 lfo21; tab-stops: list 36.0pt" align="left"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?><span style="mso-list: ignore">4.<span style="font: 7pt 'Times New Roman'">          </span></span></span><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>LSP</span><span style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>让我们得Z个重要的l论Q一个模型如果孤立的看,q不h真正意义的有效性。模型的有效性只能通过它的客户E序来表现。必L据设计的使用者做出的合理假设来审视它。而假设是难以预测的,直到设计臭味出现的时候才处理它们?<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-left: 27pt; vertical-align: middle; text-indent: -18pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan; mso-list: l4 level1 lfo22; tab-stops: list 36.0pt" align="left"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?><span style="mso-list: ignore">5.<span style="font: 7pt 'Times New Roman'">          </span></span></span><span style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>对于<span lang="EN-US">LSP</span>的违反也潜在的违反了(jin)<span lang="EN-US">OCP <o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%; text-align: left; mso-pagination: widow-orphan; mso-outline-level: 1" align="left"><b><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 18.0pt; mso-bidi-font-family: ?hu)?>DIP</span></b><b><span style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 18.0pt; mso-bidi-font-family: ?hu)?>Q依赖倒置原则<span lang="EN-US"><o:p></o:p></span></span></b></p> <p class="MsoNormal" style="margin-left: 27pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan" align="left"><span style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>高层模块不应该依赖于底层模块二者都应该依赖于抽?span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-left: 27pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan" align="left"><span style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>抽象不应该依赖于l节l节应该依赖于抽?span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-left: 27pt; vertical-align: middle; text-indent: -18pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan; mso-list: l7 level1 lfo23; tab-stops: list 36.0pt" align="left"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?><span style="mso-list: ignore">1.<span style="font: 7pt 'Times New Roman'">          </span></span></span><span style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>什么是高层模块Q高层模块包含了(jin)应用E序中重要的{略选择和业务模型。这些高层模块其所在的应用E序区别于其它?<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-left: 27pt; vertical-align: middle; text-indent: -18pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan; mso-list: l7 level1 lfo24; tab-stops: list 36.0pt" align="left"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?><span style="mso-list: ignore">2.<span style="font: 7pt 'Times New Roman'">          </span></span></span><span style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>如果高层模块依赖于底层模块,那么在不同的上下文中重用高层模块׃(x)变得十分困难。然而,如果高层模块独立于底层模块,那么高层模块可以非常容易的被重用。该原则是框架设计的核?j)原则?<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-left: 27pt; vertical-align: middle; text-indent: -18pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan; mso-list: l7 level1 lfo25; tab-stops: list 36.0pt" align="left"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?><span style="mso-list: ignore">3.<span style="font: 7pt 'Times New Roman'">          </span></span></span><span style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>q里的倒置不仅仅是依赖关系的倒置也是接口所有权的倒置。应用了(jin)<span lang="EN-US">DIP</span>我们?x)发现往(xin)往(xin)是客h有抽象的接口Q而服务者从q些抽象接口z?<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-left: 27pt; vertical-align: middle; text-indent: -18pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan; mso-list: l7 level1 lfo26; tab-stops: list 36.0pt" align="left"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?><span style="mso-list: ignore">4.<span style="font: 7pt 'Times New Roman'">          </span></span></span><span style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>q就是著名的<span lang="EN-US">Hollywood</span>原则<span lang="EN-US">:"Don't call us we'll call you."</span>底层模块实现?jin)在高层模块声明q被高层模块调用的接口?<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-left: 27pt; vertical-align: middle; text-indent: -18pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan; mso-list: l7 level1 lfo27; tab-stops: list 36.0pt" align="left"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?><span style="mso-list: ignore">5.<span style="font: 7pt 'Times New Roman'">          </span></span></span><span style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>通过倒置我们创徏?jin)更灉| 更持久更Ҏ(gu)改变的结?<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-left: 27pt; vertical-align: middle; text-indent: -18pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan; mso-list: l7 level1 lfo28; tab-stops: list 36.0pt" align="left"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?><span style="mso-list: ignore">6.<span style="font: 7pt 'Times New Roman'">          </span></span></span><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>DIP</span><span style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>的简单的启发规则Q依赖于抽象Q这是一个简单的陈述Q该规则不应该依赖于具体的类Q也是说程序汇L有的依赖都应该种植于抽象cL者接口?<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-left: 27pt; vertical-align: middle; text-indent: -18pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan; mso-list: l7 level1 lfo29; tab-stops: list 36.0pt" align="left"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?><span style="mso-list: ignore">7.<span style="font: 7pt 'Times New Roman'">          </span></span></span><span style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>如果一个类很稳定,那么依赖于它不会(x)造成伤害。然而我们自q具体cd多是不稳定的Q通过把他们隐藏在抽象接口后面可以隔离不稳定性?<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-left: 27pt; vertical-align: middle; text-indent: -18pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan; mso-list: l7 level1 lfo30; tab-stops: list 36.0pt" align="left"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?><span style="mso-list: ignore">8.<span style="font: 7pt 'Times New Roman'">          </span></span></span><span style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>依赖倒置可以应用于Q何存在一个类向另一个类发送消息的地方 <span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-left: 27pt; vertical-align: middle; text-indent: -18pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan; mso-list: l7 level1 lfo31; tab-stops: list 36.0pt" align="left"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?><span style="mso-list: ignore">9.<span style="font: 7pt 'Times New Roman'">          </span></span></span><span style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>依赖倒置原则是实现许多面向对象技术多宣称的好处的基本底层机制Q是面向对象的标志所在?<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%; text-align: left; mso-pagination: widow-orphan; mso-outline-level: 1" align="left"><b><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 18.0pt; mso-bidi-font-family: ?hu)?>ISP:</span></b><b><span style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 18.0pt; mso-bidi-font-family: ?hu)?>接口隔离原则<span lang="EN-US"><o:p></o:p></span></span></b></p> <p class="MsoNormal" style="margin-left: 27pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan" align="left"><span style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>不应该强q客L(fng)序依赖它们不需要的使用的方法?span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-left: 27pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan" align="left"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?> <o:p></o:p></span></p> <p class="MsoNormal" style="margin-left: 27pt; vertical-align: middle; text-indent: -18pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan; mso-list: l0 level1 lfo32; tab-stops: list 36.0pt" align="left"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?><span style="mso-list: ignore">1.<span style="font: 7pt 'Times New Roman'">          </span></span></span><span style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>接口不是高内聚的Q一个接口可以分?span lang="EN-US">N</span>l方法,那么q个接口需要?span lang="EN-US">ISP</span>处理一下?<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-left: 27pt; vertical-align: middle; text-indent: -18pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan; mso-list: l0 level1 lfo33; tab-stops: list 36.0pt" align="left"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?><span style="mso-list: ignore">2.<span style="font: 7pt 'Times New Roman'">          </span></span></span><span style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>接口的划分是׃用它的客L(fng)序决定的Q客L(fng)序是分离的接口也应该是分ȝ?<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-left: 27pt; vertical-align: middle; text-indent: -18pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan; mso-list: l0 level1 lfo34; tab-stops: list 36.0pt" align="left"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?><span style="mso-list: ignore">3.<span style="font: 7pt 'Times New Roman'">          </span></span></span><span style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>一个接口中包含太多行ؓ(f)时候,D它们的客L(fng)序之间生不正常的依赖关p,我们要做的就是分L口,实现解耦?<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="margin-left: 27pt; vertical-align: middle; text-indent: -18pt; line-height: 150%; text-align: left; mso-pagination: widow-orphan; mso-list: l0 level1 lfo35; tab-stops: list 36.0pt" align="left"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?><span style="mso-list: ignore">4.<span style="font: 7pt 'Times New Roman'">          </span></span></span><span style="font-size: 12pt; line-height: 150%; font-family: ?hu)? mso-font-kerning: 0pt; mso-bidi-font-family: ?hu)?>应用?span lang="EN-US">ISP</span>之后Q客L(fng)序看到的是多个内聚的接口?<span lang="EN-US"><o:p></o:p></span></span></p> <p class="MsoNormal" style="line-height: 150%"><span lang="EN-US" style="font-size: 12pt; line-height: 150%; font-family: ?hu)?><o:p> </o:p></span></p><img src ="http://m.shnenglu.com/woaidongmao/aggbug/70096.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/woaidongmao/" target="_blank">肥仔</a> 2008-12-22 21:19 <a href="http://m.shnenglu.com/woaidongmao/archive/2008/12/22/70096.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OOP 设计原则之概?/title><link>http://m.shnenglu.com/woaidongmao/archive/2008/12/22/70095.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Mon, 22 Dec 2008 13:17:00 GMT</pubDate><guid>http://m.shnenglu.com/woaidongmao/archive/2008/12/22/70095.html</guid><wfw:comment>http://m.shnenglu.com/woaidongmao/comments/70095.html</wfw:comment><comments>http://m.shnenglu.com/woaidongmao/archive/2008/12/22/70095.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/woaidongmao/comments/commentRss/70095.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/woaidongmao/services/trackbacks/70095.html</trackback:ping><description><![CDATA[<p class="MsoNormal"><strong><span lang="EN-US" style="font-size: 13.5pt; color: black; font-family: verdana">SRP </span></strong><strong><span style="font-size: 13.5pt; color: black; font-family: ?hu)? mso-ascii-font-family: verdana; mso-hansi-font-family: verdana">单一职责原则</span></strong><b><span lang="EN-US" style="font-size: 11.5pt; color: #006699; font-family: verdana; mso-font-kerning: 18.0pt"><?xml:namespace prefix = o /><o:p></o:p></span></b></p> <p class="MsoNormal"><span style="font-size: 13.5pt; color: black; font-family: ?hu)? mso-ascii-font-family: verdana; mso-hansi-font-family: verdana">׃个类而言Q应该仅有一个引起它变化的原因?/span></p> <p class="MsoNormal"><span style="font-size: 13.5pt; color: black; font-family: ?hu)? mso-ascii-font-family: verdana; mso-hansi-font-family: verdana"></span><span lang="EN-US" style="font-size: 13.5pt; color: black; font-family: verdana"><o:p></o:p></span> </p> <p class="MsoNormal"><strong><span lang="EN-US" style="font-size: 13.5pt; color: black; font-family: verdana">OCP </span></strong><strong><span style="font-size: 13.5pt; color: black; font-family: ?hu)? mso-ascii-font-family: verdana; mso-hansi-font-family: verdana">开?/span></strong><strong><span lang="EN-US" style="font-size: 13.5pt; color: black; font-family: verdana">———?/span></strong><strong><span style="font-size: 13.5pt; color: black; font-family: ?hu)? mso-ascii-font-family: verdana; mso-hansi-font-family: verdana">闭原则</span></strong><span lang="EN-US" style="font-size: 13.5pt; color: black; font-family: verdana"><o:p></o:p></span></p> <p class="MsoNormal"><span style="font-size: 13.5pt; color: black; font-family: ?hu)? mso-ascii-font-family: verdana; mso-hansi-font-family: verdana">软g实体Q类、模块、函数等Q应该是可以开展的Q但是不可修攏V?/span></p> <p class="MsoNormal"><span style="font-size: 13.5pt; color: black; font-family: ?hu)? mso-ascii-font-family: verdana; mso-hansi-font-family: verdana"></span><span lang="EN-US" style="font-size: 13.5pt; color: black; font-family: verdana"><o:p></o:p></span> </p> <p class="MsoNormal"><strong><span lang="EN-US" style="font-size: 13.5pt; color: black; font-family: verdana">LSP Liskov </span></strong><strong><span style="font-size: 13.5pt; color: black; font-family: ?hu)? mso-ascii-font-family: verdana; mso-hansi-font-family: verdana">替换原则</span></strong><span lang="EN-US" style="font-size: 13.5pt; color: black; font-family: verdana"><o:p></o:p></span></p> <p class="MsoNormal"><span style="font-size: 13.5pt; color: black; font-family: ?hu)? mso-ascii-font-family: verdana; mso-hansi-font-family: verdana">子类型必能够替换掉它们的父cd?/span></p> <p class="MsoNormal"><span style="font-size: 13.5pt; color: black; font-family: ?hu)? mso-ascii-font-family: verdana; mso-hansi-font-family: verdana"></span><span lang="EN-US" style="font-size: 13.5pt; color: black; font-family: verdana"><o:p></o:p></span> </p> <p class="MsoNormal"><strong><span lang="EN-US" style="font-size: 13.5pt; color: black; font-family: verdana">DIP </span></strong><strong><span style="font-size: 13.5pt; color: black; font-family: ?hu)? mso-ascii-font-family: verdana; mso-hansi-font-family: verdana">依赖倒置原则</span></strong><span lang="EN-US" style="font-size: 13.5pt; color: black; font-family: verdana"><o:p></o:p></span></p> <p class="MsoNormal"><span style="font-size: 13.5pt; color: black; font-family: ?hu)? mso-ascii-font-family: verdana; mso-hansi-font-family: verdana">抽象不应该依赖于l节。细节应该依赖于抽象?/span></p> <p class="MsoNormal"><span style="font-size: 13.5pt; color: black; font-family: ?hu)? mso-ascii-font-family: verdana; mso-hansi-font-family: verdana"></span><span lang="EN-US" style="font-size: 13.5pt; color: black; font-family: verdana"><o:p></o:p></span> </p> <p class="MsoNormal"><strong><span lang="EN-US" style="font-size: 13.5pt; color: black; font-family: verdana">ISP </span></strong><strong><span style="font-size: 13.5pt; color: black; font-family: ?hu)? mso-ascii-font-family: verdana; mso-hansi-font-family: verdana">接口隔离原则</span></strong><span lang="EN-US" style="font-size: 13.5pt; color: black; font-family: verdana"><o:p></o:p></span></p> <p class="MsoNormal"><span style="font-size: 13.5pt; color: black; font-family: ?hu)? mso-ascii-font-family: verdana; mso-hansi-font-family: verdana">不应该强q客户依赖于它们不用的方法。接口属于客P不属于它所在的cdơ结?/span></p> <p class="MsoNormal"><span style="font-size: 13.5pt; color: black; font-family: ?hu)? mso-ascii-font-family: verdana; mso-hansi-font-family: verdana"></span><span lang="EN-US" style="font-size: 13.5pt; color: black; font-family: verdana"><o:p></o:p></span> </p> <p class="MsoNormal"><strong><span lang="EN-US" style="font-size: 13.5pt; color: black; font-family: verdana">REP </span></strong><strong><span style="font-size: 13.5pt; color: black; font-family: ?hu)? mso-ascii-font-family: verdana; mso-hansi-font-family: verdana">重用发布{h(hun)原则</span></strong><b><span lang="EN-US" style="font-size: 13.5pt; color: black; font-family: verdana"><o:p></o:p></span></b></p> <p class="MsoNormal"><span style="font-size: 13.5pt; color: black; font-family: ?hu)? mso-ascii-font-family: verdana; mso-hansi-font-family: verdana">重用的粒度就是发布的_度</span></p> <p class="MsoNormal"><span style="font-size: 13.5pt; color: black; font-family: ?hu)? mso-ascii-font-family: verdana; mso-hansi-font-family: verdana"></span><span lang="EN-US" style="font-size: 13.5pt; color: black; font-family: verdana"><o:p></o:p></span> </p> <p class="MsoNormal"><strong><span lang="EN-US" style="font-size: 13.5pt; color: black; font-family: verdana">CCP </span></strong><strong><span style="font-size: 13.5pt; color: black; font-family: ?hu)? mso-ascii-font-family: verdana; mso-hansi-font-family: verdana">共同闭原则</span></strong><span lang="EN-US" style="font-size: 13.5pt; color: black; font-family: verdana"><o:p></o:p></span></p> <p class="MsoNormal"><span style="font-size: 13.5pt; color: black; font-family: ?hu)? mso-ascii-font-family: verdana; mso-hansi-font-family: verdana">包中的所有类对于同一cL质的变化应该是共同闭的。一个变化若对一个包产生影响Q则对该包中的所有类产生影响Q而对于其它的包不造成M影响?/span></p> <p class="MsoNormal"><span style="font-size: 13.5pt; color: black; font-family: ?hu)? mso-ascii-font-family: verdana; mso-hansi-font-family: verdana"></span><span lang="EN-US" style="font-size: 13.5pt; color: black; font-family: verdana"><o:p></o:p></span> </p> <p class="MsoNormal"><strong><span lang="EN-US" style="font-size: 13.5pt; color: black; font-family: verdana">CRP </span></strong><strong><span style="font-size: 13.5pt; color: black; font-family: ?hu)? mso-ascii-font-family: verdana; mso-hansi-font-family: verdana">共同重用原则</span></strong><b><span lang="EN-US" style="font-size: 13.5pt; color: black; font-family: verdana"><o:p></o:p></span></b></p> <p class="MsoNormal"><span style="font-size: 13.5pt; color: black; font-family: ?hu)? mso-ascii-font-family: verdana; mso-hansi-font-family: verdana">一个包中的所有类应该是共同重用的。如果重用了(jin)包中的一个类Q那么就要重用包中的所有类?/span></p> <p class="MsoNormal"><span style="font-size: 13.5pt; color: black; font-family: ?hu)? mso-ascii-font-family: verdana; mso-hansi-font-family: verdana"></span><span lang="EN-US" style="font-size: 13.5pt; color: black; font-family: verdana"><o:p></o:p></span> </p> <p class="MsoNormal"><strong><span lang="EN-US" style="font-size: 13.5pt; color: black; font-family: verdana">ADP </span></strong><strong><span style="font-size: 13.5pt; color: black; font-family: ?hu)? mso-ascii-font-family: verdana; mso-hansi-font-family: verdana">无环依赖原则</span></strong><span lang="EN-US" style="font-size: 13.5pt; color: black; font-family: verdana"><o:p></o:p></span></p> <p class="MsoNormal"><span style="font-size: 13.5pt; color: black; font-family: ?hu)? mso-ascii-font-family: verdana; mso-hansi-font-family: verdana">在包的依赖关pd中不允许存在环?/span></p> <p class="MsoNormal"><span style="font-size: 13.5pt; color: black; font-family: ?hu)? mso-ascii-font-family: verdana; mso-hansi-font-family: verdana"></span><span lang="EN-US" style="font-size: 13.5pt; color: black; font-family: verdana"><o:p></o:p></span> </p> <p class="MsoNormal"><strong><span lang="EN-US" style="font-size: 13.5pt; color: black; font-family: verdana">SDP </span></strong><strong><span style="font-size: 13.5pt; color: black; font-family: ?hu)? mso-ascii-font-family: verdana; mso-hansi-font-family: verdana">E_依赖原则</span></strong><span lang="EN-US" style="font-size: 13.5pt; color: black; font-family: verdana"><o:p></o:p></span></p> <p class="MsoNormal"><span style="font-size: 13.5pt; color: black; font-family: ?hu)? mso-ascii-font-family: verdana; mso-hansi-font-family: verdana">朝着E_的方向进行依?/span></p> <p class="MsoNormal"><span style="font-size: 13.5pt; color: black; font-family: ?hu)? mso-ascii-font-family: verdana; mso-hansi-font-family: verdana"></span><span lang="EN-US" style="font-size: 13.5pt; color: black; font-family: verdana"><o:p></o:p></span> </p> <p class="MsoNormal"><strong><span lang="EN-US" style="font-size: 13.5pt; color: black; font-family: verdana">SAP </span></strong><strong><span style="font-size: 13.5pt; color: black; font-family: ?hu)? mso-ascii-font-family: verdana; mso-hansi-font-family: verdana">E_抽象原则</span></strong><span lang="EN-US" style="font-size: 13.5pt; color: black; font-family: verdana"><o:p></o:p></span></p> <p class="MsoNormal"><span style="font-size: 13.5pt; color: black; font-family: ?hu)? mso-ascii-font-family: verdana; mso-hansi-font-family: verdana">包的抽象E度应该和其E_E度一致?/span></p><img src ="http://m.shnenglu.com/woaidongmao/aggbug/70095.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/woaidongmao/" target="_blank">肥仔</a> 2008-12-22 21:17 <a href="http://m.shnenglu.com/woaidongmao/archive/2008/12/22/70095.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OOP之里氏代换原?/title><link>http://m.shnenglu.com/woaidongmao/archive/2008/12/16/69567.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Tue, 16 Dec 2008 06:24:00 GMT</pubDate><guid>http://m.shnenglu.com/woaidongmao/archive/2008/12/16/69567.html</guid><wfw:comment>http://m.shnenglu.com/woaidongmao/comments/69567.html</wfw:comment><comments>http://m.shnenglu.com/woaidongmao/archive/2008/12/16/69567.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.shnenglu.com/woaidongmao/comments/commentRss/69567.html</wfw:commentRss><trackback:ping>http://m.shnenglu.com/woaidongmao/services/trackbacks/69567.html</trackback:ping><description><![CDATA[<p class=MsoNormal style="LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: ?hu)? LETTER-SPACING: 0.4pt; mso-bidi-font-family: arial; mso-font-kerning: 0pt">  里氏代换原则<span lang=EN-US>(Liskov Substitution Principle LSP)</span>面向对象设计的基本原则之一?span lang=EN-US><o:p></o:p></span></span></p> <p class=MsoNormal style="LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: ?hu)? LETTER-SPACING: 0.4pt; mso-bidi-font-family: arial; mso-font-kerning: 0pt">  里氏代换原则中说QQ何基cd以出现的地方Q子cM定可以出现?span lang=EN-US> LSP</span>是(h)承复用的基石Q只有当衍生cd以替换掉基类QY件单位的功能不受到媄(jing)响时Q基cL能真正被复用Q而衍生类也能够在基类的基上增加新的行为?span lang=EN-US><o:p></o:p></span></span></p> <p class=MsoNormal style="LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: ?hu)? LETTER-SPACING: 0.4pt; mso-bidi-font-family: arial; mso-font-kerning: 0pt">  里氏代换原则是对<span lang=EN-US>“</span>开<span lang=EN-US>-</span>?span lang=EN-US>”</span>原则的补充。实?span lang=EN-US>“</span>开<span lang=EN-US>-</span>?span lang=EN-US>”</span>原则的关键步骤就是抽象化。而基cM子类的(h)承关pd是抽象化的具体实玎ͼ所以里氏代换原则是对实现抽象化的具体步骤的规范?span lang=EN-US><o:p></o:p></span></span></p> <p class=MsoNormal style="LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: ?hu)? LETTER-SPACING: 0.4pt; mso-bidi-font-family: arial; mso-font-kerning: 0pt">  一般而言Q违反里氏代换原则的Q也q背<span lang=EN-US>“</span>开<span lang=EN-US>-</span>?span lang=EN-US>”</span>原则Q反q来不一定成立?span lang=EN-US><o:p></o:p></span></span></p> <p class=MsoNormal style="LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: ?hu)? LETTER-SPACING: 0.4pt; mso-bidi-font-family: arial; mso-font-kerning: 0pt">  <span lang=EN-US>LSP</span>讲的是基cd子类的关pR只有当q种关系存在Ӟ里氏代换关系才存在。如果两个具体的c?span lang=EN-US>A</span>Q?span lang=EN-US>B</span>之间的关p违反了(jin)<span lang=EN-US>LSP</span>的设计,<span lang=EN-US>(</span>假设是从<span lang=EN-US>B</span>?span lang=EN-US>A</span>的(h)承关p?span lang=EN-US>)</span>那么Ҏ(gu)具体的情况可以在下面的两U重构方案中选择一U?span lang=EN-US><o:p></o:p></span></span></p> <p class=MsoNormal style="LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: ?hu)? LETTER-SPACING: 0.4pt; mso-bidi-font-family: arial; mso-font-kerning: 0pt">  <span lang=EN-US>-----</span>创徏一个新的抽象类<span lang=EN-US>C</span>Q作Z个具体类的超c,?span lang=EN-US>A</span>Q?span lang=EN-US>B</span>的共同行为移动到<span lang=EN-US>C</span>中来解决问题?span lang=EN-US><o:p></o:p></span></span></p> <p class=MsoNormal style="LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: ?hu)? LETTER-SPACING: 0.4pt; mso-bidi-font-family: arial; mso-font-kerning: 0pt">  <span lang=EN-US>-----</span>?span lang=EN-US>B</span>?span lang=EN-US>A</span>的(h)承关pL为委zօpR?span lang=EN-US><o:p></o:p></span></span></p> <p class=MsoNormal style="LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: ?hu)? LETTER-SPACING: 0.4pt; mso-bidi-font-family: arial; mso-font-kerning: 0pt">  Z(jin)说明Q我们先用第一U方法来看一个例子,W二U办法在另外一个原则中说明。我们就看那个著名的长方形和正方形的例子。对于长方Ş的类Q如果它的长宽相{,那么它就是一个正方ŞQ因此,长方形类的对象中有一些正方Ş的对象。对于一个正方Ş的类Q它的方法有?span lang=EN-US>setSide</span>?span lang=EN-US>getSide</span>Q它不是长方形的子类Q和长方形也不会(x)W合<span lang=EN-US>LSP</span>?span lang=EN-US><o:p></o:p></span></span></p> <p class=MsoNormal style="LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: ?hu)? LETTER-SPACING: 0.4pt; mso-bidi-font-family: arial; mso-font-kerning: 0pt">  <span lang=EN-US>eg:<o:p></o:p></span></span></p> <p class=MsoNormal style="LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: ?hu)? LETTER-SPACING: 0.4pt; mso-bidi-font-family: arial; mso-font-kerning: 0pt">  长方形类Q?span lang=EN-US><o:p></o:p></span></span></p> <p class=MsoNormal style="LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: ?hu)? LETTER-SPACING: 0.4pt; mso-bidi-font-family: arial; mso-font-kerning: 0pt">  <span lang=EN-US>public class Rectangle{<o:p></o:p></span></span></p> <p class=MsoNormal style="LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: ?hu)? LETTER-SPACING: 0.4pt; mso-bidi-font-family: arial; mso-font-kerning: 0pt">  <span lang=EN-US>...<o:p></o:p></span></span></p> <p class=MsoNormal style="LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: ?hu)? LETTER-SPACING: 0.4pt; mso-bidi-font-family: arial; mso-font-kerning: 0pt">  <span lang=EN-US>setWidth(int width){<o:p></o:p></span></span></p> <p class=MsoNormal style="LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: ?hu)? LETTER-SPACING: 0.4pt; mso-bidi-font-family: arial; mso-font-kerning: 0pt">  <span lang=EN-US>this.width=width;<o:p></o:p></span></span></p> <p class=MsoNormal style="LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: ?hu)? LETTER-SPACING: 0.4pt; mso-bidi-font-family: arial; mso-font-kerning: 0pt">  <span lang=EN-US>}<o:p></o:p></span></span></p> <p class=MsoNormal style="LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: ?hu)? LETTER-SPACING: 0.4pt; mso-bidi-font-family: arial; mso-font-kerning: 0pt">  <span lang=EN-US>setHeight(int height){<o:p></o:p></span></span></p> <p class=MsoNormal style="LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: ?hu)? LETTER-SPACING: 0.4pt; mso-bidi-font-family: arial; mso-font-kerning: 0pt">  <span lang=EN-US>this.height=height<o:p></o:p></span></span></p> <p class=MsoNormal style="LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: ?hu)? LETTER-SPACING: 0.4pt; mso-bidi-font-family: arial; mso-font-kerning: 0pt">  <span lang=EN-US>}<o:p></o:p></span></span></p> <p class=MsoNormal style="LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: ?hu)? LETTER-SPACING: 0.4pt; mso-bidi-font-family: arial; mso-font-kerning: 0pt">  <span lang=EN-US>}<o:p></o:p></span></span></p> <p class=MsoNormal style="LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: ?hu)? LETTER-SPACING: 0.4pt; mso-bidi-font-family: arial; mso-font-kerning: 0pt">  正方形类Q?span lang=EN-US><o:p></o:p></span></span></p> <p class=MsoNormal style="LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: ?hu)? LETTER-SPACING: 0.4pt; mso-bidi-font-family: arial; mso-font-kerning: 0pt">  <span lang=EN-US>public class Square{<o:p></o:p></span></span></p> <p class=MsoNormal style="LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: ?hu)? LETTER-SPACING: 0.4pt; mso-bidi-font-family: arial; mso-font-kerning: 0pt">  <span lang=EN-US>...<o:p></o:p></span></span></p> <p class=MsoNormal style="LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: ?hu)? LETTER-SPACING: 0.4pt; mso-bidi-font-family: arial; mso-font-kerning: 0pt">  <span lang=EN-US>setWidth(int width){<o:p></o:p></span></span></p> <p class=MsoNormal style="LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: ?hu)? LETTER-SPACING: 0.4pt; mso-bidi-font-family: arial; mso-font-kerning: 0pt">  <span lang=EN-US>this.width=width;<o:p></o:p></span></span></p> <p class=MsoNormal style="LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: ?hu)? LETTER-SPACING: 0.4pt; mso-bidi-font-family: arial; mso-font-kerning: 0pt">  <span lang=EN-US>this. height=width;<o:p></o:p></span></span></p> <p class=MsoNormal style="LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: ?hu)? LETTER-SPACING: 0.4pt; mso-bidi-font-family: arial; mso-font-kerning: 0pt">  <span lang=EN-US>}<o:p></o:p></span></span></p> <p class=MsoNormal style="LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: ?hu)? LETTER-SPACING: 0.4pt; mso-bidi-font-family: arial; mso-font-kerning: 0pt">  <span lang=EN-US>setHeight(int height){<o:p></o:p></span></span></p> <p class=MsoNormal style="LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: ?hu)? LETTER-SPACING: 0.4pt; mso-bidi-font-family: arial; mso-font-kerning: 0pt">  <span lang=EN-US>this.setWidth(height);<o:p></o:p></span></span></p> <p class=MsoNormal style="LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: ?hu)? LETTER-SPACING: 0.4pt; mso-bidi-font-family: arial; mso-font-kerning: 0pt">  <span lang=EN-US>}<o:p></o:p></span></span></p> <p class=MsoNormal style="LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: ?hu)? LETTER-SPACING: 0.4pt; mso-bidi-font-family: arial; mso-font-kerning: 0pt">  <span lang=EN-US>}<o:p></o:p></span></span></p> <p class=MsoNormal style="LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: ?hu)? LETTER-SPACING: 0.4pt; mso-bidi-font-family: arial; mso-font-kerning: 0pt">  例子中改变边长的函数Q?span lang=EN-US><o:p></o:p></span></span></p> <p class=MsoNormal style="LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: ?hu)? LETTER-SPACING: 0.4pt; mso-bidi-font-family: arial; mso-font-kerning: 0pt">  <span lang=EN-US>public void resize(Rectangle r){<o:p></o:p></span></span></p> <p class=MsoNormal style="LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: ?hu)? LETTER-SPACING: 0.4pt; mso-bidi-font-family: arial; mso-font-kerning: 0pt">  <span lang=EN-US>while(r.getHeight()<r.getWidth){<o:p></o:p></span></span></p> <p class=MsoNormal style="LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: ?hu)? LETTER-SPACING: 0.4pt; mso-bidi-font-family: arial; mso-font-kerning: 0pt">  <span lang=EN-US>r.setHeight(r.getWidth+1);<o:p></o:p></span></span></p> <p class=MsoNormal style="LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: ?hu)? LETTER-SPACING: 0.4pt; mso-bidi-font-family: arial; mso-font-kerning: 0pt">  <span lang=EN-US>}<o:p></o:p></span></span></p> <p class=MsoNormal style="LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: ?hu)? LETTER-SPACING: 0.4pt; mso-bidi-font-family: arial; mso-font-kerning: 0pt">  <span lang=EN-US>}<o:p></o:p></span></span></p> <p class=MsoNormal style="LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: ?hu)? LETTER-SPACING: 0.4pt; mso-bidi-font-family: arial; mso-font-kerning: 0pt">  那么Q如果让正方形当做是长方形的子类Q会(x)出现什么情况呢Q我们让正方形从长方形(h)承,然后在它的内部设|?span lang=EN-US>width</span>{于<span lang=EN-US>height</span>Q这P只要<span lang=EN-US>width</span>或?span lang=EN-US>height</span>被赋|那么<span lang=EN-US>width</span>?span lang=EN-US>height</span>?x)被同时赋|q样׃证了(jin)正方形类中,<span lang=EN-US>width</span>?span lang=EN-US>height</span>L相等?span lang=EN-US>.</span>现在我们假设有个客户c,其中有个Ҏ(gu)Q规则是q样的,试传入的长方Ş的宽度是否大于高度,如果满停止下来,否则增加宽度的倹{现在我们来看,如果传入的是基类长方形,q个q行的很好。根?span lang=EN-US>LSP</span>Q我们把基类替换成它的子c,l果应该也是一L(fng)Q但是因为正方Şcȝ<span lang=EN-US>width</span>?span lang=EN-US>height</span>?x)同时赋|q个Ҏ(gu)没有l束的时候,条gL不满I也就是说Q替换成子类后,E序的行为发生了(jin)变化Q它不满?span lang=EN-US>LSP</span>?span lang=EN-US><o:p></o:p></span></span></p> <p class=MsoNormal style="LINE-HEIGHT: 150%; TEXT-ALIGN: left; mso-pagination: widow-orphan" align=left><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: ?hu)? LETTER-SPACING: 0.4pt; mso-bidi-font-family: arial; mso-font-kerning: 0pt">  那么我们用第一U方案进行重构,我们构造一个抽象的四边形类Q把长方形和正方形共同的行ؓ(f)攑ֈq个四边形类里面Q让长方形和正方形都是它的子c,问题?span lang=EN-US>OK</span>?jin)。对于长方Ş和正方ŞQ取<span lang=EN-US>width</span>?span lang=EN-US>height</span>是它们共同的行ؓ(f)Q但是给<span lang=EN-US>width</span>?span lang=EN-US>height</span>赋|两者行Z同,因此Q这个抽象的四边形的cd有取值方法,没有赋值方法。上面的例子中那个方法只?x)适用于不同的子类Q?span lang=EN-US>LSP</span>也就不会(x)被破坏?span lang=EN-US><o:p></o:p></span></span></p> <p class=MsoNormal style="LINE-HEIGHT: 150%"><span style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: ?hu)? LETTER-SPACING: 0.4pt; mso-bidi-font-family: arial; mso-font-kerning: 0pt">  在进行设计的时候,我们量从抽象类l承Q而不是从具体cȝ(h)ѝ如果从l承{?wi)来看,所有叶子节点应当是具体c,而所有的?wi)枝节点应当是抽象类或者接口。当然这个只是一个一般性的指导原则Q用的时候还要具体情况具体分析?/span><span lang=EN-US style="FONT-SIZE: 12pt; COLOR: black; LINE-HEIGHT: 150%; FONT-FAMILY: ?hu)? mso-bidi-font-family: arial"><o:p></o:p></span></p> <img src ="http://m.shnenglu.com/woaidongmao/aggbug/69567.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.shnenglu.com/woaidongmao/" target="_blank">肥仔</a> 2008-12-16 14:24 <a href="http://m.shnenglu.com/woaidongmao/archive/2008/12/16/69567.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://m.shnenglu.com/" title="精品视频久久久久">精品视频久久久久</a> <div class="friend-links"> </div> </div> </footer> <a href="http://www.wufayulecheng.cn" target="_blank">þþþƷҰ</a>| <a href="http://www.pouhai.cn" target="_blank">͵͵þþþվ</a>| <a href="http://www.cynh.net.cn" target="_blank">ҹavþþþ</a>| <a href="http://www.caoguowan.cn" target="_blank">þþƷһ</a>| <a href="http://www.0546bbs.cn" target="_blank">ɫɫݺɫۺϾþ</a>| <a href="http://www.dzeuegg.cn" target="_blank">ŷһþþþþþôƬ</a>| <a href="http://www.jingxuan001.cn" target="_blank">뾫Ʒþþþþ</a>| <a href="http://www.hdtnet.cn" target="_blank">պþþþþ </a>| <a href="http://www.msve.cn" target="_blank">þþþþþþ˳</a>| <a href="http://www.xmxfz.cn" target="_blank">þþþù</a>| <a href="http://www.u24373.cn" target="_blank">޹Ʒ˾þ</a>| <a href="http://www.honglinzhiyi.cn" target="_blank">þþƷ91þ鶹 </a>| <a href="http://www.w4749.cn" target="_blank">ھƷþù½</a>| <a href="http://www.40theft.cn" target="_blank">þˬ˾ƷƵ</a>| <a href="http://www.modim.cn" target="_blank">99þùۺϾƷˮ</a>| <a href="http://www.shaokao166.cn" target="_blank">99ξþþŷƷվ</a>| <a href="http://www.id19.cn" target="_blank">ŮƷþþ</a>| <a href="http://www.geiduan.cn" target="_blank">þþĻ</a>| <a href="http://www.zgcl.org.cn" target="_blank">99þ뾫Ʒϵ</a>| <a href="http://www.enfb.cn" target="_blank">պƷþþþþþõӰ</a>| <a href="http://www.zfbwgd.cn" target="_blank">۲ӰԺþþƷ</a>| <a href="http://www.xyftapp.cn" target="_blank">޾Ʒþþþȥq </a>| <a href="http://www.dgchengxin.cn" target="_blank">˾þô߽ۺ</a>| <a href="http://www.2782yh.cn" target="_blank">ҹ888þ</a>| <a href="http://www.918jj.cn" target="_blank">þþƷ99þþ</a>| <a href="http://www.17wgame.cn" target="_blank">18պҹþó </a>| <a href="http://www.mmmbbb.cn" target="_blank">Ļ˾þ</a>| <a href="http://www.lntyyp.cn" target="_blank">㽶þӰԺ</a>| <a href="http://www.unicity642.com.cn" target="_blank">ŷ޾Ʒ˾þԻӰƬ</a>| <a href="http://www.287853x.cn" target="_blank">Ʒþþþþþ</a>| <a href="http://www.daleiba.cn" target="_blank">Ʒþ99</a>| <a href="http://www.fsyongli188.cn" target="_blank">þùһ</a>| <a href="http://www.vfqt.cn" target="_blank">Avþ</a>| <a href="http://www.qequ.cn" target="_blank">ɫվþþþۺywww</a>| <a href="http://www.huiju365.cn" target="_blank">ղƷþþһ</a>| <a href="http://www.4neq.cn" target="_blank">þԭƷ</a>| <a href="http://www.sxjax.cn" target="_blank">þۺ97ɫһһ </a>| <a href="http://www.vzrg.cn" target="_blank">޹Ʒþþþþ</a>| <a href="http://www.ktrb.net.cn" target="_blank">޾ƷŮþþ</a>| <a href="http://www.mirbase.cn" target="_blank">ݺɫþۺ</a>| <a href="http://www.omqw.cn" target="_blank">þþþþAVר</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>