设计模式总结(一)

507 阅读7分钟
  • 通过封装,继承,多态把程序的耦合度降低,使程序更加灵活,容易修改,易于复用

    简单工厂
    public class Operation {
          public double NumberA { get; set; }
          public double NumberB { get; set; }
          public virtual double GetResult()
          {
              double result = 0;
              return result;
          }
      }
      public class OperationAdd:Operation
      {
          public override double GetResult()
          {
              double result = 0;
              result = NumberA + NumberB;
              return result;
          }
      }
      public class OperationFactory
      {
          public static Operation createOperate(string operate)
          {
              Operation oper = null;
              switch (operate)
              {
                  case "+":oper = new OperationAdd(); break;
                  default:
                      break;
              }
              return oper;
          }
      }
    
              Operation oper;
              oper = OperationFactory.createOperate("+");
              oper.NumberA = 3;
              oper.NumberB = 5;
              double result = oper.GetResult();
    策略模式-基本代码
  • 策略模式是一种定义了一系列算法的方法,以相同的方式调用所有的方法,减少了各种算法类与使用算法之间的耦合。

    class Program
     {
         static void Main(string[] args)
         {
             Context context;
    
             context = new Context(new ConcreteStrategyA());
             context.ContextInterface();
    
             context = new Context(new ConcreteStrategyB());
             context.ContextInterface();
    
             context = new Context(new ConcreteStrategyC());
             context.ContextInterface();
    
             Console.Read();
         }
     }
    
     //抽象算法类
     abstract class Strategy
     {
         //算法方法
         public abstract void AlgorithmInterface();
     }
     //具体算法A
     class ConcreteStrategyA : Strategy
     {
         //算法A实现方法
         public override void AlgorithmInterface()
         {
             Console.WriteLine("算法A实现");
         }
     }
     //具体算法B
     class ConcreteStrategyB : Strategy
     {
         //算法B实现方法
         public override void AlgorithmInterface()
         {
             Console.WriteLine("算法B实现");
         }
     }
     //具体算法C
     class ConcreteStrategyC : Strategy
     {
         //算法C实现方法
         public override void AlgorithmInterface()
         {
             Console.WriteLine("算法C实现");
         }
     }
     //上下文
     class Context
     {
         Strategy strategy;
    
         public Context(Strategy strategy)
         {
             this.strategy = strategy;
         }
         //上下文接口
         public void ContextInterface()
         {
             strategy.AlgorithmInterface();
         }
     }
  1. 单一职责原则
  2. 开放-封闭原则
  3. 依赖倒转原则
    • 高层模块不应该依赖低层模块,两个都依赖抽象
    • 抽象不应该依赖细节,细节应该依赖抽象
  • 里氏代换原则:子类必须能哆替换掉它们的父类 *父类才能真正被复用,而子类也能够在父类的基础上增加新的行为。

  • 依赖倒转其实可以说是面向对象的标志,针对抽象编程而不是针对细节编程,所有的依赖关系都终止于抽象类或者接口,反之就是过程化的设计。

    装饰模式
    class Program
      {
          static void Main(string[] args)
          {
              Person xc = new Person("小菜");
    
              Console.WriteLine("\n第一种装扮:");
    
              Sneakers pqx = new Sneakers();
              BigTrouser kk = new BigTrouser();
              TShirts dtx = new TShirts();
    
              pqx.Decorate(xc);
              kk.Decorate(pqx);
              dtx.Decorate(kk);
              dtx.Show();
    
              Console.WriteLine("\n第二种装扮:");
    
              LeatherShoes px = new LeatherShoes();
              Tie ld = new Tie();
              Suit xz = new Suit();
    
              px.Decorate(xc);
              ld.Decorate(px);
              xz.Decorate(ld);
              xz.Show();
    
              Console.WriteLine("\n第三种装扮:");
              Sneakers pqx2 = new Sneakers();
              LeatherShoes px2 = new LeatherShoes();
              BigTrouser kk2 = new BigTrouser();
              Tie ld2 = new Tie();
    
              pqx2.Decorate(xc);
              px2.Decorate(pqx);
              kk2.Decorate(px2);
              ld2.Decorate(kk2);
    
              ld2.Show();
    
              Console.Read();
          }
      }
    
      class Person
      {
          public Person()
          { }
    
          private string name;
          public Person(string name)
          {
              this.name = name;
          }
    
          public virtual void Show()
          {
              Console.WriteLine("装扮的{0}", name);
          }
      }
    
      class Finery : Person
      {
          protected Person component;
    
          //打扮
          public void Decorate(Person component)
          {
              this.component = component;
          }
    
          public override void Show()
          {
              if (component != null)
              {
                  component.Show();
              }
          }
      }
    
    
class TShirts : Finery
{
    public override void Show()
    {
        Console.Write("大T恤 ");
        base.Show();
    }
}

class BigTrouser : Finery
{
    public override void Show()
    {
        Console.Write("垮裤 ");
        base.Show();
    }
}

class Sneakers : Finery
{
    public override void Show()
    {
        Console.Write("破球鞋 ");
        base.Show();
    }
}

class Suit : Finery
{
    public override void Show()
    {
        Console.Write("西装 ");
        base.Show();
    }
}

class Tie : Finery
{
    public override void Show()
    {
        Console.Write("领带 ");
        base.Show();
    }
}

class LeatherShoes : Finery
{
    public override void Show()
    {
        Console.Write("皮鞋 ");
        base.Show();
    }
}
* 装饰模式是对已有功能动态添加更多功能的一种方式。
* 当系统需要新功能,是向旧的类中添加新的代码,这些新加的代码通常装饰了原有类的核心职责或方要行为,在主类中加入了新的字段,新的方法和新的逻辑,从而增加了主类的复杂度,而这些新加入的东西仅仅是为了满足一些只在某种特定情况下才会执行的特殊行为的需要。而装饰模式把装饰功能放到单独的类中,并让这个类包装它所要装饰的对象。把类中的装饰功能从类中搬移去除,这样简化原有类,有效的把类的核心职责和装饰功能区分开,去除相关类中重复的装饰逻辑。
###### 代理模式
class Program
{
    static void Main(string[] args)
    {
        SchoolGirl jiaojiao = new SchoolGirl();
        jiaojiao.Name = "李娇娇";

        Proxy daili = new Proxy(jiaojiao);

        daili.GiveDolls();
        daili.GiveFlowers();
        daili.GiveChocolate();


        Console.Read();
    }
}

//送礼物
interface GiveGift
{
    void GiveDolls();
    void GiveFlowers();
    void GiveChocolate();
}

class Proxy : GiveGift
{
    Pursuit gg;
    public Proxy(SchoolGirl mm)
    {
        gg = new Pursuit(mm);
    }


    public void GiveDolls()
    {
        gg.GiveDolls();
    }

    public void GiveFlowers()
    {
        gg.GiveFlowers();
    }

    public void GiveChocolate()
    {
        gg.GiveChocolate();
    }
}

class Pursuit : GiveGift
{
    SchoolGirl mm;
    public Pursuit(SchoolGirl mm)
    {
        this.mm = mm;
    }
    public void GiveDolls()
    {
        Console.WriteLine(mm.Name + " 送你洋娃娃");
    }

    public void GiveFlowers()
    {
        Console.WriteLine(mm.Name + " 送你鲜花");
    }

    public void GiveChocolate()
    {
        Console.WriteLine(mm.Name + " 送你巧克力");
    }
}

class SchoolGirl
{
    private string name;
    public string Name
    {
        get { return name; }
        set { name = value; }
    }
}
* 远程代理
* 虚拟代理
* 安全代理
* 智能指引
###### 工厂方法模式

///

/// 运算类 /// class Operation { private double _numberA = 0; private double _numberB = 0;

    public double NumberA
    {
        get { return _numberA; }
        set { _numberA = value; }
    }

    public double NumberB
    {
        get { return _numberB; }
        set { _numberB = value; }
    }

    /// <summary>
    /// 得到运算结果
    /// </summary>
    /// <returns></returns>
    public virtual double GetResult()
    {
        double result = 0;
        return result;
    }
}

/// <summary>
/// 加法类
/// </summary>
class OperationAdd : Operation
{
    public override double GetResult()
    {
        double result = 0;
        result = NumberA + NumberB;
        return result;
    }
}

/// <summary>
/// 减法类
/// </summary>
class OperationSub : Operation
{
    public override double GetResult()
    {
        double result = 0;
        result = NumberA - NumberB;
        return result;
    }
}
/// <summary>
/// 乘法类
/// </summary>
class OperationMul : Operation
{
    public override double GetResult()
    {
        double result = 0;
        result = NumberA * NumberB;
        return result;
    }
}
/// <summary>
/// 除法类
/// </summary>
class OperationDiv : Operation
{
    public override double GetResult()
    {
        double result = 0;
        if (NumberB == 0)
            throw new Exception("除数不能为0。");
        result = NumberA / NumberB;
        return result;
    }
}

/// <summary>
/// 工厂方法
/// </summary>
interface IFactory
{
    Operation CreateOperation();
}

/// <summary>
/// 专门负责生产“+”的工厂
/// </summary>
class AddFactory : IFactory
{
    public Operation CreateOperation()
    {
        return new OperationAdd();
    }
}

/// <summary>
/// 专门负责生产“-”的工厂
/// </summary>
class SubFactory : IFactory
{
    public Operation CreateOperation()
    {
        return new OperationSub();
    }
}

/// <summary>
/// 专门负责生产“*”的工厂
/// </summary>
class MulFactory : IFactory
{
    public Operation CreateOperation()
    {
        return new OperationMul();
    }
}

/// <summary>
/// 专门负责生产“/”的工厂
/// </summary>
class DivFactory : IFactory
{
    public Operation CreateOperation()
    {
        return new OperationDiv();
    }
}
* 工厂方法模式实现时,客户端需要决定实例化哪一个工厂来实现运算类,选择判断的问题还是存在,工厂方法把简单工厂的内部逻辑判断移到了客户端代码来进行,你要加的功能,本来是改工厂类,而现在是修改客户端。
###### 原型模式

class Program { static void Main(string[] args) { Resume a = new Resume("大鸟"); a.SetPersonalInfo("男", "29"); a.SetWorkExperience("1998-2000", "XX公司");

        Resume b = (Resume)a.Clone();
        b.SetWorkExperience("1998-2006", "YY企业");

        Resume c = (Resume)a.Clone();
        c.SetWorkExperience("1998-2003", "ZZ企业");

        a.Display();
        b.Display();
        c.Display();

        Console.Read();

    }
}

//简历
class Resume : ICloneable
{
    private string name;
    private string sex;
    private string age;

    private WorkExperience work;

    public Resume(string name)
    {
        this.name = name;
        work = new WorkExperience();
    }

    private Resume(WorkExperience work)
    {
        this.work = (WorkExperience)work.Clone();
    }

    //设置个人信息
    public void SetPersonalInfo(string sex, string age)
    {
        this.sex = sex;
        this.age = age;
    }
    //设置工作经历
    public void SetWorkExperience(string workDate, string company)
    {
        work.WorkDate = workDate;
        work.Company = company;
    }

    //显示
    public void Display()
    {
        Console.WriteLine("{0} {1} {2}", name, sex, age);
        Console.WriteLine("工作经历:{0} {1}", work.WorkDate, work.Company);
    }

    public Object Clone()
    {
        Resume obj = new Resume(this.work);

        obj.name = this.name;
        obj.sex = this.sex;
        obj.age = this.age;


        return obj;
    }

}

//工作经历
class WorkExperience : ICloneable
{
    private string workDate;
    public string WorkDate
    {
        get { return workDate; }
        set { workDate = value; }
    }
    private string company;
    public string Company
    {
        get { return company; }
        set { company = value; }
    }

    public Object Clone()
    {
        return (Object)this.MemberwiseClone();
    }
}
* 浅复制,深复制
###### 模板模式

class Program { static void Main(string[] args) { AbstractClass c;

        c = new ConcreteClassA();
        c.TemplateMethod();

        c = new ConcreteClassB();
        c.TemplateMethod();

        Console.Read();

    }
}

abstract class AbstractClass
{
    public abstract void PrimitiveOperation1();
    public abstract void PrimitiveOperation2();

    public void TemplateMethod()
    {
        PrimitiveOperation1();
        PrimitiveOperation2();
        Console.WriteLine("");
    }
}

class ConcreteClassA : AbstractClass
{
    public override void PrimitiveOperation1()
    {
        Console.WriteLine("具体类A方法1实现");
    }
    public override void PrimitiveOperation2()
    {
        Console.WriteLine("具体类A方法2实现");
    }
}

class ConcreteClassB : AbstractClass
{
    public override void PrimitiveOperation1()
    {
        Console.WriteLine("具体类B方法1实现");
    }
    public override void PrimitiveOperation2()
    {
        Console.WriteLine("具体类B方法2实现");
    }
}
###### 外观模式

class Program { static void Main(string[] args) { Facade facade = new Facade();

        facade.MethodA();
        facade.MethodB();

        Console.Read();

    }
}

class SubSystemOne
{
    public void MethodOne()
    {
        Console.WriteLine(" 子系统方法一");
    }
}

class SubSystemTwo
{
    public void MethodTwo()
    {
        Console.WriteLine(" 子系统方法二");
    }
}

class SubSystemThree
{
    public void MethodThree()
    {
        Console.WriteLine(" 子系统方法三");
    }
}

class SubSystemFour
{
    public void MethodFour()
    {
        Console.WriteLine(" 子系统方法四");
    }
}

class Facade
{
    SubSystemOne one;
    SubSystemTwo two;
    SubSystemThree three;
    SubSystemFour four;

    public Facade()
    {
        one = new SubSystemOne();
        two = new SubSystemTwo();
        three = new SubSystemThree();
        four = new SubSystemFour();
    }

    public void MethodA()
    {
        Console.WriteLine("\n方法组A() ---- ");
        one.MethodOne();
        two.MethodTwo();
        four.MethodFour();
    }

    public void MethodB()
    {
        Console.WriteLine("\n方法组B() ---- ");
        two.MethodTwo();
        three.MethodThree();
    }
}
###### 建造者模式

class Program { static void Main(string[] args) { Director director = new Director(); Builder b1 = new ConcreteBuilder1(); Builder b2 = new ConcreteBuilder2();

        director.Construct(b1);
        Product p1 = b1.GetResult();
        p1.Show();

        director.Construct(b2);
        Product p2 = b2.GetResult();
        p2.Show();

        Console.Read();
    }
}

class Director
{
    public void Construct(Builder builder)
    {
        builder.BuildPartA();
        builder.BuildPartB();
    }
}

abstract class Builder
{
    public abstract void BuildPartA();
    public abstract void BuildPartB();
    public abstract Product GetResult();
}

class ConcreteBuilder1 : Builder
{
    private Product product = new Product();

    public override void BuildPartA()
    {
        product.Add("部件A");
    }

    public override void BuildPartB()
    {
        product.Add("部件B");
    }

    public override Product GetResult()
    {
        return product;
    }
}

class ConcreteBuilder2 : Builder
{
    private Product product = new Product();
    public override void BuildPartA()
    {
        product.Add("部件X");
    }

    public override void BuildPartB()
    {
        product.Add("部件Y");
    }

    public override Product GetResult()
    {
        return product;
    }
}

class Product
{
    IList<string> parts = new List<string>();

    public void Add(string part)
    {
        parts.Add(part);
    }

    public void Show()
    {
        Console.WriteLine("\n产品 创建 ----");
        foreach (string part in parts)
        {
            Console.WriteLine(part);
        }
    }
}

```

本文由博客群发一文多发等运营工具平台 OpenWrite 发布