一步步构建多层架构系列二之设计模式运用篇
上节我们讲到数据对象创建的管理,那么如何管理数据访问类的对象创建呢?先从为什么需要设计模式的原理说起吧
为了更好的理解设计思想,我尽可能的用实例来演示推进。但随着需求的增加,程序将越来越复杂。此时就有修改设计的必要,重构和设计模式就可以派上用场了。最后当设计渐趋完美后,你会发现,即使需求不断增加,你也可以神清气闲,不用为代码设计而烦恼了。
using System;
using System.Collections.Generic;
using System.Text;
/*场景摸拟:
小明:听说导演要重拍天龙八部,你去吗?
小华:我哪有这个条件啊,不过毕竟我是学影视导演方向的,如果我能做导演就好了。
小明:去你的,就你那水平,不过,说真的,如果让你做导演,你会怎么做?
小华说:我会先招男主角,比如:乔峰和段誉。看看我是如何招的?
*/
namespace ConsoleApplication3
{
//我们定义了两个类乔峰和段誉,并且要求他们都会打,所以我们定了strike方法
class Qiaofeng : Nanzhujiao
{
public override void strike()
{
Console.Write("this is qiaofeng's action");
Console.Read();
}
}
class Duanyu : Nanzhujiao
{
public override void strike()
{
Console.Write("this is qiaofeng's action");
Console.Read();
}
}
//现在乔峰和段誉都具有打这个方法,为什么我们不能把它们提出来单独的做成一个类呢?于是我们可以这样,因为是抽像类,所以不能实便化
public abstract class Nanzhujiao
{
public abstract void strike();
}
//现在我要指派乔峰上场了,如何区分到底是谁上场呢?
class daoyan
{
static void test(Nanzhujiao nan)
{
nan.strike();
}
}
//此时导演如果决定起用虚猪,那么我们仅需要编写虚猪类即可,其它的可不动。
//现在三个男主角我们已经全部起用了,现在导演要招女演员了,怎么办?难道我们还让王语嫣去继承男演员吗?当然不行,那么我们这样做:
//我们定义了两个类王语嫣和穆姐姐
class Wangyuyan : luzhujiao
{
public override void strike()
{
Console.Write("this is Wangyuyan's action");
Console.Read();
}
}
class Mujiejie : luzhujiao
{
public override void strike()
{
Console.Write("this is Mujiejie's action");
Console.Read();
}
}
//现在王语嫣和穆姐姐都具有打这个方法
public abstract class luzhujiao
{
public abstract void strike();
}
//现在导演觉得太烦了,既要管男演员,又要管女演员,太累了,于是导演定义了一个标准:要都会打就行了。
//因为接口这个利器你还没有用上(虽然你也可以用抽象类,但在C#里只支持类的单继承)
public interface Inormal
{
void strike();
}
//不管是男演员还是女演员都要照标准做,于是:
我们修改上面的两个抽象类,让它们实现上面的Inormal,如下:
public abstract class Nanzhujiao : Inormal
{
public abstract void strike();
}
public abstract class luzhujiao : Inormal
{
public abstract void strike();
}
通过上面的分析,我们现在可以让导演来指派该谁上场了:如下:
//于是,导演就可以用下面的方法来指派人了
public class daoyan
{
public static void test(Inormal nan)
{
nan.strike();
}
}
//我们可以得出这样一个结论:在调用类对象的属性和方法时,尽量避免将具体类对象作为传递参数,而应传递其抽象对象,
//更好地是传递接口,将实际的调用和具体对象完全剥离开,这样可以提高代码的灵活性。
//下面来看看我们如何去调用
class Program
{
static void Main(string[] args)
{
Inormal nan1=null;
string arg = "wangyuyan";//此处可以根据下拉框选择来选定
switch (arg)
{
case "Qiaofeng":
nan1 = new Qiaofeng();
break;
case "Duanyu":
nan1 = new Duanyu();
break;
case "wangyuyan":
nan1 = new Wangyuyan();
break;
}
daoyan.test(nan1);
}
}
这些讨厌的switch语句又出现了,有没方法把这些烦烦的switch消掉呢。我们来努力一下,该是让工厂模式来生产对象的时候了:
public interface IcreateFactory
{
Inormal CreateObject();
}
public class qiaofengCreate : IcreateFactory
{
public Inormal CreateObject()
{
return new Qiaofeng();
}
}
public class wangyuyianCreate : IcreateFactory
{
public Inormal CreateObject()
{
return new Wangyuyan();
}
}
这样,由工厂模式直接创造出对象,比如:乔峰,段誉,王语嫣等,下面就可以这样调用了:
IcreateFactory i = new qiaofengCreate();
i.CreateObject().strike();
通过以上方法我们部分的消除了switch语句,因为总是要用条件去判断到底该实例化哪个类。幸运的是,.net给我们提供了一种非常好的机制来消除这种现象,这就是利用类名反射,我们来看一下如何做:
首先,在web.config文件中添加如下配置:
<appSettings>
<add key="WebDAL" value="Pyllot.EC.Cargo.SqlServerDAL"/>
<!--数据库连接字符串-->
<add key="SiteSqlServer" value="Server=(local);Database=Northwind;uid=sa;pwd=sa;"/>
<add key="SiteMySql" value="Host=localhost;port=3306;UserName=root;Password=mfm;Database=ec_cargo;"/>
</appSettings>
然后动态根据类名反射,从而动态实例化类,如下:
public static Pyllot.EC.Cargo.IDAL.ICategory CreateCategory()
{
string className = ConfigReader.Read("WebDAL") + ".Category";
return (Pyllot.EC.Cargo.IDAL.ICategory)Assembly.Load(ConfigReader.Read("WebDAL")).CreateInstance(className);
}
那么,上面的switch或工厂模式可以统统丢掉了,我们仅需要将以上的.Category改为qiaofeng,wangyuyan等,另外改一下配置文件中的目录即可。
好了,这个系列二分析了面向对象的封装,继承,抽像,接口,工厂模式,下一系列我们将这种思想活用于架构中,敬请期待
转载于:https://www.cnblogs.com/mfm11111/archive/2009/02/24/1397507.html
一步步构建多层架构系列二之设计模式运用篇相关推荐
- 架构系列二:使用Nginx+tomcat实现集群部署
架构系列二:使用Nginx+tomcat实现集群部署 一.环境介绍 VM1:Ubuntu-S100 IP:192.168.130.128 部署Tomcat应用及Nginx VM2:Ubuntu-S ...
- (生活小妙招系列二之:高血压篇)现在才明白,高血压的罪魁祸首不是盐,而是它!
(生活小妙招系列二之:高血压篇)现在才明白,高血压的罪魁祸首不是盐,而是它! 参考链接:https://www.sohu.com/a/224760633_172726 你知道吗?诱发高血压的真正凶手不 ...
- 微服务架构系列二:密码强度评测的实现与实验
本文是继<微服务架构系列一:关键技术与原理研究>的后续,系列一中论述了微服务研究的背景和意义,主要调研了传统架构的发展以及存在的问题和微服务架构的由来,然后针对微服务架构的设计原则.容器技 ...
- Barra模型因子的构建及应用系列二之Beta因子
一.摘要 在前期的Barra模型系列文章中,我们初步讲解并构建了Size因子.在Size因子基础上构建的单因子策略也获得了不错的绝对收益.而本期内容,我们在该系列下进一步构建Beta因子,其中基于Be ...
- 亿级商品详情页架构演进技术解密 | 高可用架构系列 二
转载:http://mp.weixin.qq.com/s?__biz=MzAwMDU1MTE1OQ==&mid=210272034&idx=1&sn=3be9d2b53c7fe ...
- NAS折腾系列二:番外篇之瘦客户机+DoraOS实现远程办公
目录 一.缘起DoraOS 二.远程办公方案对比 三.DoraOS简单介绍 四.瘦客户机选购 五.安装DoraOS云桌面系统 六.Windows+DoraOS双系统安装 七.DoraOS常见问题 八. ...
- Netty系列二、Netty原理篇
文章目录 一.Netty概述 二.Netty整体架构设计 1.Reactor模型 2.Reactor模型分类 2.1 单Reactor单线程 2.2 单Reactor多线程 2.3 多Reactor多 ...
- 【Nginx探究系列二】Nginx配置篇之客户Nginx白名单访问配置
2019独角兽企业重金招聘Python工程师标准>>> 一.简介 在通常情况下,使用 nginx 基于 ip 限制访问请求频率等限制内容,我们会需要对特定ip进行限制排除操作,因此本 ...
- Spring5系列(二) | 工厂设计模式
spring中大量使用的工厂设计模式,所以我们这个章节先简单的了解下工厂设计模式的内容. 工厂设计模式属于创建型模式中的一种.在GOF中的定义: "Define an interface f ...
最新文章
- wine 运行Adobe Audition 3.0方法
- Spring启动时的Spring社交示例,或者我如何不再担心和喜欢自动配置
- LeetCode 321. 拼接最大数(单调栈)*
- 如何在xp中添加打印机
- spark SQL压缩入门
- webpack5学习与实战-(十三)-postcss处理css3兼容性前缀
- 针对2020年市面上短信供应商的对比(8家SMS供应商对比)
- wps在任务栏取消显示多个文档的预览
- Chrome扩展程序应用商店方式一
- 【git学习】解决git提交代码时报错: Unable to create ‘XXX/.git/index.lock‘: File exists.
- 计算机安全监察word,全国计算机统考押题计算机安全
- 一文讲透,技术人如何快速提升沟通能力?
- linux文件夹加密忘记密码,如何通过密码保护Linux上的文件夹或目录?
- Linux平台设备驱动
- android 跑马灯 竖线,专为电竞和内容创作者而生!体验惠普 ENVY TE01台式机
- 肿瘤的分型、分级和分期
- 7-172 元宵花灯
- java se包括哪些_Java SE
- erp系统的服务器在哪里的,erp系统使用的云服务器
- 【20230215】EndNote20文献管理软件的使用_个人学习总结
热门文章
- 消息中间件之JMS实践(ActiveMQ)
- tomcat的部署及session绑定反代
- 20.三层技术之OSPF区域划分与路由重分发(2)
- 某熊周刊:一周推荐外文技术资料(12.2)
- 贪心 Codeforces Round #236 (Div. 2) A. Nuts
- jQuery实例——展示表格点击变色、全选、删除
- 数据科学家常用的十大机器学习算法,都在这了!
- java根据经纬度坐标计算两点的距离算法
- 《深入理解Elasticsearch(原书第2版)》一1.3 在线书店示例
- [译]15个关于Chrome的开发必备小技巧