c#设计模式(1)
这学期开设设计模式课程,将课件放上来。
课本:《C#设计模式》,电子工业出版社,ISBN 7-5053-8979-3。33元含光盘。
课程内容:设计模式
来源:亚历山大的建筑模式、Gamma等人(1995)创作的"Design Patterns: Elements of Reusable Software"。这本书通常被称作"Gang of Four"或"GoF",开创性的创造了《设计模式》。
也有人说"三十六计"就是"模式"。
一、 C# 面向对象程序设计复习
点击http://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.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对以下打印三角型的程序进行改写,写出新程序。
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.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);
}
}
}
三、 先有鸡还是先有蛋?
到底是先有鸡还是先有蛋?看下面的代码:
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。
四、 大瓶子套小瓶子还是小瓶子套大瓶子?
另外一个例子:
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
c#设计模式(1)的更多相关文章
- MVVM设计模式和WPF中的实现(四)事件绑定
MVVM设计模式和在WPF中的实现(四) 事件绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...
- java EE设计模式简介
1.何为设计模式 设计模式提供了对常见应用设计问题的解决方案.在面向对象的编程中,设计模式通常在解决与对象创建和交互相关的问题,而非整体软件架构所面对的大规模问题,它们以样板代码的形式提供了通用的解决 ...
- 计算机程序的思维逻辑 (54) - 剖析Collections - 设计模式
上节我们提到,类Collections中大概有两类功能,第一类是对容器接口对象进行操作,第二类是返回一个容器接口对象,上节我们介绍了第一类,本节我们介绍第二类. 第二类方法大概可以分为两组: 接受其他 ...
- 《JavaScript设计模式 张》整理
最近在研读另外一本关于设计模式的书<JavaScript设计模式>,这本书中描述了更多的设计模式. 一.创建型设计模式 包括简单工厂.工厂方法.抽象工厂.建造者.原型和单例模式. 1)简单 ...
- 《JavaScript设计模式与开发实践》整理
最近在研读一本书<JavaScript设计模式与开发实践>,进阶用的. 一.高阶函数 高阶函数是指至少满足下列条件之一的函数. 1. 函数可以作为参数被传递. 2. 函数可以作为返回值输出 ...
- 设计模式之行为类模式大PK
行为类模式大PK 行为类模式包括责任链模式.命令模式.解释器模式.迭代器模式.中介者模式.备忘录模式.观察者模式.状态模式.策略 ...
- .NET设计模式访问者模式
一.访问者模式的定义: 表示一个作用于某对象结构中的各元素的操作.它使你可以在不改变各元素类的前提下定义作用于这些元素的新操作. 二.访问者模式的结构和角色: 1.Visitor 抽象访问者角色,为该 ...
- Java开发中的23种设计模式详解
[放弃了原文访问者模式的Demo,自己写了一个新使用场景的Demo,加上了自己的理解] [源码地址:https://github.com/leon66666/DesignPattern] 一.设计模式 ...
- java 设计模式
目录: 设计模式六大原则(1):单一职责原则 设计模式六大原则(2):里氏替换原则 设计模式六大原则(3):依赖倒置原则 设计模式六大原则(4):接口隔离原则 设计模式六大原则(5):迪米特法则 设计 ...
- 设计模式之单例模式(Singleton)
设计模式之单例模式(Singleton) 设计模式是前辈的一些经验总结之后的精髓,学习设计模式可以针对不同的问题给出更加优雅的解答 单例模式可分为俩种:懒汉模式和饿汉模式.俩种模式分别有不同的优势和缺 ...
随机推荐
- SQL Server-语句类别、数据库范式、系统数据库组成
前言 终于等到这一天,我要开始重新系统学习数据库了,关于数据库这块,不出意外的话,每天会定时更新一篇且内容不会包含太多,简短的内容,深入的理解,Always to review the basic ...
- AI:**消灭程序员需要一百年吗?
这篇博文真的很长,不过挺有意思.关于智能机器人的发展前景还是很广的,因为每一步都异常艰难,而什么时候可以终止还无法预料,所以程序员没办法失业啊! 转自于图灵社区:http://www.ituring. ...
- apicloud开发方法。
1.前端布局 window frame 子窗口 franmegroup 子窗口组. 一个页面比如有一个固定的顶部,然后中间区域是商品或者是什么内容,那么这个整体就是一个window,那么中间的就是i ...
- LCA-倍增法(写给自己看)
LCA-倍增法 题目又做不下去来写题解了 算法思想 类似于ST表的思想维护dp[i][j]:节点i向上跳2^j高度的的节点 转移方程 \(dp[i][j]=dp[dp[i][j-1]][j-1]\)注 ...
- anaconda下jieba和wordcloud安装
1.在anaconda交互环境下安装jieba,输入命令: pip install jieba 2.在https://pypi.python.org/pypi/wordcloud下载wordclou ...
- springboot不加载bootstrap.properties文件
1.首先说一下官网对bootstrap和application两种配置文件的区别: Spring Cloud 构建于 Spring Boot 之上,在 Spring Boot 中有两种上下文,一种是 ...
- ASP组件AspJpeg(加水印)生成缩略图等使用方法
ASP组件AspJpeg(加水印)生成缩略图等使用方法 作者: 字体:[增加 减小] 类型:转载 时间:2012-12-17我要评论 ASPJPEG是一款功能相当强大的图象处理组件,用它可以轻松地做出 ...
- git入坑随笔
一直以来,都喜欢用git做版本管理,主要涉及平台是coding, github以及公司自己搭建的gitlab. 因为一直以来都是自己一个人维护前端的项目,所以基本上很少有冲突的情况.(手动微笑 :) ...
- nginx的一些
二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负载均衡 六.Nginx之页面缓存 七.Nginx之URL重写 八.Nginx之读写分离 注,操作系统为 CentOS ...
- Python 从入门到实践 - Web应用程序
一.创建项目 1.建立虚拟环境 python -m venv ll_env # 出现ll_env文件夹 2.激活虚拟环境 source ll_env/bin/activate # 要停止使用虚拟环境, ...