上节我们讲到数据对象创建的管理,那么如何管理数据访问类的对象创建呢?先从为什么需要设计模式的原理说起吧

为了更好的理解设计思想,我尽可能的用实例来演示推进。但随着需求的增加,程序将越来越复杂。此时就有修改设计的必要,重构和设计模式就可以派上用场了。最后当设计渐趋完美后,你会发现,即使需求不断增加,你也可以神清气闲,不用为代码设计而烦恼了。

Code
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,如下:

Code
    public abstract class Nanzhujiao : Inormal
    {
        public abstract void strike();
    }

public abstract class luzhujiao : Inormal
    {
        public abstract void strike();
    }

通过上面的分析,我们现在可以让导演来指派该谁上场了:如下:

Code
//于是,导演就可以用下面的方法来指派人了
    
    public class daoyan
    {
       public static void test(Inormal nan)
        {
            nan.strike();
        }
    }
    //我们可以得出这样一个结论:在调用类对象的属性和方法时,尽量避免将具体类对象作为传递参数,而应传递其抽象对象,
    //更好地是传递接口,将实际的调用和具体对象完全剥离开,这样可以提高代码的灵活性。
Code
//下面来看看我们如何去调用
    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消掉呢。我们来努力一下,该是让工厂模式来生产对象的时候了:

Code
 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文件中添加如下配置:

Code
    <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>

然后动态根据类名反射,从而动态实例化类,如下:

Code
        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

一步步构建多层架构系列二之设计模式运用篇相关推荐

  1. 架构系列二:使用Nginx+tomcat实现集群部署

    架构系列二:使用Nginx+tomcat实现集群部署 一.环境介绍  VM1:Ubuntu-S100 IP:192.168.130.128 部署Tomcat应用及Nginx  VM2:Ubuntu-S ...

  2. (生活小妙招系列二之:高血压篇)现在才明白,高血压的罪魁祸首不是盐,而是它!

    (生活小妙招系列二之:高血压篇)现在才明白,高血压的罪魁祸首不是盐,而是它! 参考链接:https://www.sohu.com/a/224760633_172726 你知道吗?诱发高血压的真正凶手不 ...

  3. 微服务架构系列二:密码强度评测的实现与实验

    本文是继<微服务架构系列一:关键技术与原理研究>的后续,系列一中论述了微服务研究的背景和意义,主要调研了传统架构的发展以及存在的问题和微服务架构的由来,然后针对微服务架构的设计原则.容器技 ...

  4. Barra模型因子的构建及应用系列二之Beta因子

    一.摘要 在前期的Barra模型系列文章中,我们初步讲解并构建了Size因子.在Size因子基础上构建的单因子策略也获得了不错的绝对收益.而本期内容,我们在该系列下进一步构建Beta因子,其中基于Be ...

  5. 亿级商品详情页架构演进技术解密 | 高可用架构系列 二

    转载:http://mp.weixin.qq.com/s?__biz=MzAwMDU1MTE1OQ==&mid=210272034&idx=1&sn=3be9d2b53c7fe ...

  6. NAS折腾系列二:番外篇之瘦客户机+DoraOS实现远程办公

    目录 一.缘起DoraOS 二.远程办公方案对比 三.DoraOS简单介绍 四.瘦客户机选购 五.安装DoraOS云桌面系统 六.Windows+DoraOS双系统安装 七.DoraOS常见问题 八. ...

  7. Netty系列二、Netty原理篇

    文章目录 一.Netty概述 二.Netty整体架构设计 1.Reactor模型 2.Reactor模型分类 2.1 单Reactor单线程 2.2 单Reactor多线程 2.3 多Reactor多 ...

  8. 【Nginx探究系列二】Nginx配置篇之客户Nginx白名单访问配置

    2019独角兽企业重金招聘Python工程师标准>>> 一.简介 在通常情况下,使用 nginx 基于 ip 限制访问请求频率等限制内容,我们会需要对特定ip进行限制排除操作,因此本 ...

  9. Spring5系列(二) | 工厂设计模式

    spring中大量使用的工厂设计模式,所以我们这个章节先简单的了解下工厂设计模式的内容. 工厂设计模式属于创建型模式中的一种.在GOF中的定义: "Define an interface f ...

最新文章

  1. wine 运行Adobe Audition 3.0方法
  2. Spring启动时的Spring社交示例,或者我如何不再担心和喜欢自动配置
  3. LeetCode 321. 拼接最大数(单调栈)*
  4. 如何在xp中添加打印机
  5. spark SQL压缩入门
  6. webpack5学习与实战-(十三)-postcss处理css3兼容性前缀
  7. 针对2020年市面上短信供应商的对比(8家SMS供应商对比)
  8. wps在任务栏取消显示多个文档的预览
  9. Chrome扩展程序应用商店方式一
  10. 【git学习】解决git提交代码时报错: Unable to create ‘XXX/.git/index.lock‘: File exists.
  11. 计算机安全监察word,全国计算机统考押题计算机安全
  12. 一文讲透,技术人如何快速提升沟通能力?
  13. linux文件夹加密忘记密码,如何通过密码保护Linux上的文件夹或目录?
  14. Linux平台设备驱动
  15. android 跑马灯 竖线,专为电竞和内容创作者而生!体验惠普 ENVY TE01台式机
  16. 肿瘤的分型、分级和分期
  17. 7-172 元宵花灯
  18. java se包括哪些_Java SE
  19. erp系统的服务器在哪里的,erp系统使用的云服务器
  20. 【20230215】EndNote20文献管理软件的使用_个人学习总结

热门文章

  1. 消息中间件之JMS实践(ActiveMQ)
  2. tomcat的部署及session绑定反代
  3. 20.三层技术之OSPF区域划分与路由重分发(2)
  4. 某熊周刊:一周推荐外文技术资料(12.2)
  5. 贪心 Codeforces Round #236 (Div. 2) A. Nuts
  6. jQuery实例——展示表格点击变色、全选、删除
  7. 数据科学家常用的十大机器学习算法,都在这了!
  8. java根据经纬度坐标计算两点的距离算法
  9. 《深入理解Elasticsearch(原书第2版)》一1.3 在线书店示例
  10. [译]15个关于Chrome的开发必备小技巧