zoukankan      html  css  js  c++  java
  • C#设计模式(1)

    课本:《C#设计模式》,电子工业出版社,ISBN 7-5053-8979-3。33元含光盘。

    课程内容:设计模式

    来源:亚历山大的建筑模式、Gamma等人(1995)创作的"Design Patterns: Elements of Reusable Software"。这本书通常被称作"Gang of Four"或"GoF",开创性的创造了《设计模式》。

    也有人说"三十六计"就是"模式"。


    一、 C# 面向对象程序设计复习

      点击https://files.cnblogs.com/zhenyulu/CSharp.rar下载,内容包括:

      字段与属性.cs
      属性、方法作用范围.cs
      一加到一百.cs
      使用接口排序(2).cs
      使用接口排序(1).cs
      求质数.cs
      冒泡法排序.cs
      九九表.cs
      静态与非静态.cs
      构造函数.cs
      方法重载.cs
      多态性.cs
      递归求阶乘.cs
      打印三角形.cs
      传值调用与引用调用.cs

     

    二、 设计模式举例

    在设计模式中有一种模式叫Builder模式,其原理如下:

    我们可以将Builder理解成电饭锅,给这个Builder放进去米和水,经过Builder的Build后,我们就可以取出香喷喷的米饭了。
    C#中有一个类叫StringBuilder,输入必要的信息后,就可以取出对应的String。其使用方法如下:

    using System;
    using System.Text;

    class Exam
    {
     
    public static void Main()
     
    {
      StringBuilder sb 
    = new StringBuilder();
      sb.Append(
    'a',2);
      sb.Append(
    'b',3);
      sb.Append(
    'c',4);
      Console.WriteLine(sb.ToString()); 
    //打印出 aabbbcccc
      sb.Remove(0, sb.Length); //清除sb中的所有信息
     }

    }

    程序执行结果为: aabbbcccc
    请使用StringBuilder对以下打印三角型的程序进行改写,写出新程序。

    using System;
    public class Exam
    {
     
    public static void Main()
     
    {
      Console.Write(
    "请输入行数:");
      
    int lines = int.Parse(Console.ReadLine());
      Console.WriteLine(
    "");
      
    for(int i=1; i<=lines ; i++)
      
    {
       
    for(int k=1; k<= lines-i; k++)
        Console.Write(
    " ");
       
    for(int j=1; j<=i*2-1; j++)
        Console.Write(
    "*");
       Console.WriteLine(
    "");
      }

    }

    }

    答:

    using System;
    using System.Text;
    class Exam
    {
     
    public static void Main()
     
    {
      Console.Write(
    "请输入行数:");
      
    int lines = int.Parse(Console.ReadLine());
      Console.WriteLine(
    "");

      StringBuilder sb 
    = new StringBuilder();

      
    for(int i=1; i<=lines ; i++)
      
    {
       sb.Append(
    ' ', lines-i);
       sb.Append(
    '*', i*2-1);
       Console.WriteLine(sb.ToString());
       sb.Remove(
    0, sb.Length);
      }

     }

    }

     

    三、 先有鸡还是先有蛋?

    到底是先有鸡还是先有蛋?看下面的代码:

    using System;

    class Client
    {
       
    public static void Main ()
       
    {
          Base b 
    = new Base();
          Derived d 
    = new Derived();
          b.d 
    = d;
          Console.WriteLine(b.d.m);      
       }

    }


    class Base
    {
       
    public int n = 9;
       
    public Derived d;
    }


    class Derived : Base
    {
       
    public int m = 10;   
    }

    Derived继承自Base,可以说没有Base就没有Derived,可Base里面有一个成员是Derived类型。到底是先有鸡还是先有蛋?这个程序可以正常编译执行并打印结果10。

     

    四、 大瓶子套小瓶子还是小瓶子套大瓶子?

    另外一个例子:

    using System;

    class Client
    {
       
    public static void Main ()
       
    {
          A a 
    = new A();
          B b 
    = new B();
          a.b 
    = b;
          b.a 
    = a;
       }

    }


    class A
    {
       
    public B b;
    }


    class B
    {
       
    public A a; 
    }

    上面的代码似乎描述了"a包含b,b包含a"的关系,到底是大瓶子套小瓶子还是小瓶子套大瓶子呢?

     

    五、 .net本质

    关于"先有鸡还是先有蛋"的程序,系统运行后,内存结构如下:
     

    由图中可以看出,根本不存在鸡与蛋的问题,而是型与值的问题以及指针引用的问题。

    关于"大瓶子套小瓶子还是小瓶子套大瓶子"问题,系统运行后,内存结构如下:


     
    由于是指针引用,所以也无所谓大瓶子还是小瓶子了。

    关于更多内容可以参考《.NET本质论 第1卷:公共语言运行库》。



    参考文献:
    阎宏,《Java与模式》,电子工业出版社
    [美]James W. Cooper,《C#设计模式》,电子工业出版社
    [美]Alan Shalloway  James R. Trott,《Design Patterns Explained》,中国电力出版社
    [美]Robert C. Martin,《敏捷软件开发-原则、模式与实践》,清华大学出版社
    [美]Don Box, Chris Sells,《.NET本质论 第1卷:公共语言运行库》,中国电力出版社
    http://www.dofactory.com/Patterns/Patterns.aspx 
  • 相关阅读:
    hdu 3342 Legal or Not 拓排序
    hdu 1596 find the safest road Dijkstra
    hdu 1874 畅通工程续 Dijkstra
    poj 2676 sudoku dfs
    poj 2251 BFS
    poj Prime Path BFS
    poj 3278 BFS
    poj 2387 Dijkstra 模板
    poj 3083 DFS 和BFS
    poj 1062 昂贵的聘礼 dijkstra
  • 原文地址:https://www.cnblogs.com/kokoliu/p/470116.html
Copyright © 2011-2022 走看看