设计模式学习(简单工厂、策略模式、单一职责、开闭原则)

时间:2021-06-17 21:58:10

最近看了一本大话设计模式,这本书用生动的故事和对话来给读者讲解设计模式及设计原则的相关知识,对于大家学习面向对象有很大帮助。

学习设计模式及原则好处可以使代码设计更具有易重用性、易扩展性、易维护性、灵活性。

最先了解了《简单工厂模式》

简单工厂以工厂类的方式创建所需功能类对象,在客户端类调用工厂类的创建对象方法即可实现需求。

增加一个新功能需求,只需编写新功能类代码和在工厂类中添加新功能分支。而不是像我们初学者最开始写代码的所有功能只在客户端中完成,完全没有领会到面向对象的精髓。封装、继承、多态。

比如:

某一类功能将其抽象出一个父类,新增一个功能只需写一个子类继承它。子类中实现父类共有的方法体现多态。再编写一个工厂类,初学者可利用switch语句对应每种功能一个case语句创建相关功能类的对象,调用重写或重载的方法实现功能。

精髓代码:

public class Father
{
public virtual void GetResult();
}

public class Son1:Father
{
public override void GetResult()
{
Console.WriteLine("1");
}
}

public class Son2:Father
{
public override void GetResult()
{
Console.WriteLine("2");
}
}

public class SimpleFactory
{
public static void CreateSon(int sonNum)
{
Father f;
switch(sonNum){
case 1:f=new Son1();break;
case 2:f=new Son2();break;
}
}
}


static void Main()
{
Father fa=SimpleFactory.CreateSon(1);
fa.GetResult();

Console.Read();
}

第二是《策略模式》

策略Strategy模式封装了变化,将多种策略抽象。客户端经常性改动策略对源代码无较大影响,将策略对象封装到一个Context类中,客户端只需识别该类,而不用像简单工厂模式还需了解工厂类。

abstract class Father
{
public abstract void GetResult();
}

public class Son1:Father
{
public override void GetResult()
{
Console.WriteLine("1");
}
}

public class Son2:Father
{
public override void GetResult()
{
Console.WriteLine("2");
}
}

public class SonContext
{
Father fa;
public SonContext(int sonNum)
{
switch(sonNum)
{
case 1:fa=new Son1();break;
case 2:fa=new Son2();break;}}
public void Get()
{
fa.GetResult();
}
}
 
static void Main()
{
SonContext sc=new SonContext(1);
sc.Get();
Console.Read();
}
将对象进一步封装。策略模式是一种定义一系列算法的方法。从概念看,所有算法完成的都是相同的工作,只是实现不同,可以用相同的方式调用所有算法,减少各种算法类与使用算法类之间的耦合。

策略模式是用来封装算法的,在实践中,可以用它封装几乎任何类型的规则,只要在分析过程中需要不同时间应用不同的业务规则,即可考虑策略模式。基本策略模式,选择所用具体实现职责由客户端对象承担,并转给策略模式的Context对象。


单一职责原则

每个类只针对一种变化,即对应一个职责。一个类承担职责过多,代码变得脆弱,耦合度增大。将职责分离为代码设计的重点,但不可过度抽象。


开放封闭原则

对修改关闭、对扩展开放。使程序在需求变动时,只需扩展代码即可,而不用更改全部代码。应预测可能的变化,构造抽象隔离变化。   时机:等待变化发生时立即采取行动!