`

《深入浅出设计模式-中文版》读书笔记 开篇乱弹(一)

阅读更多

  oreilly的《Head.First设计模式》,《深入浅出设计模式》是一本好书,用生动的语言讲解设计模式。而且是逐级深入,并没有一上来就gof23,就一大套设计模式的理论。而是用例子切入,使得读者逐步的理解设计模式的好处,理解设计模式可以解决的问题,使我们有了继续读下去的理由和勇气,而不至于被大片的理论所击倒。

  更加容易入门,为以后读那些理论打下坚实的基础。

  感谢作者写出一本这么好的书。

  设计原则一:

  找出应用中可能需要变化的地方,把他们独立出来,不要和那些不需要变化的代码混合在一起。

  把会变化的部分取出来“封装”起来,以便以后可以轻易的修改和扩展此部分,而不会影响不需要变化的部分。

  单一职责原则。

  设计原则二:

  针对接口编程,而不是针对实现编程。

  针对接口编程,这里的接口是广义的接口,不止包括语法中的接口interface

  

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->public interface IFlyBehavior
   {
       
void Fly ();
   }
  

 

  还包括抽象类,其实就是一个超类型,反正不是具体的实现类,这样就可以利用多态,不会被绑死到一种具体的类型和实现上。这句话也可以解释为变量的声明应该是超类型,通常是一个抽象类或者是一个接口,因此只要是实现了超类的具体类产生的对象,都可以赋值给这个变量。

  

代码
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->public abstract class Animal
    {
        
public abstract void MakeSound();
    }
    
public class Dog : Animal
    {
        
public override void MakeSound()
        {
            bark();
        }
        
public void bark()
        { }
    }
    
public class Cat : Animal
    {
        
public override void MakeSound()
        {
            meow();
        }
        
public void meow()
        { }
    }

 

  针对实现编程的调用代码

  

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> public void Caller1()
        {
            Dog dog 
= new Dog();
            dog.bark();
        }
  

 

  针对接口编程的调用代码

  

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> public void Caller2()
        {
            Animal a 
= new Cat();
            a.MakeSound();
        }

 

  在上面的代码中Animal a = new Cat();动物的创建还是被硬编码了,我们还可以在代码运行的时候再来指定创建的类型,就是我们不关心创建的类型是什么,只要可以进行makesound就可以了。方法有很多,常见的就是利用一个工厂类,将对象的创建交给工程类来完成,只要告诉它需要创建的对象的特征即可。这里我们简单的使用对象的类型名称代表对象。

  

  简单工厂类

代码
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />-->public class AnimalFactory
    {
        
public static Animal CreateAnimal(string type)
        {
            
switch (type)
            {
                
case "dog":
                    
return new Dog();
                    
break;
                
case "cat":
                    
return new Cat();
                    
break;
                
default:
                    
return null;
                    
break;
            }
        }
    }

 

    
  调用方

  

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> public void Caller3()
        {
            Animal a 
= AnimalFactory .CreateAnimal ("cat");
            a.MakeSound();
        }
  

 

  但是我们还是在工厂方法中看到了switch或者是很多的if。。。else。。。,如果有新类型添加,这个静态方法还是要不断的添加,越来越长,就会不符合OPC原则,有什么更好的办法吗?

  答案是:有。

  我们可以将系统现有的类型都预先创建出来,然后再外部调用静态方法的时候,给他需要的对象就可以了。

  

代码
<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> public class AnimalFactory
    {
        
private Dictionary<string, Animal> _animals;
        
private AnimalFactory()
        {
            _animals 
= new Dictionary<string, Animal>();
            _animals.Add(
"dog"new Dog());
            _animals.Add(
"cat"new Cat());
        }
        
private static AnimalFactory _instance = new AnimalFactory();
        
private static  object _lockObj = new object();
        
public static AnimalFactory GetInstance()
        {
            
if (_instance == null)
            {
                
lock (_lockObj)
                {
                    
if (_instance == null)
                        _instance 
= new AnimalFactory();
                }
            }
            
return _instance;
        }

        
public  Animal CreateAnimal(string type)
        {
            
return _animals[type];
            
//switch (type)
            
//{
            
//    case "dog":
            
//        return new Dog();
            
//        break;
            
//    case "cat":
            
//        return new Cat();
            
//        break;
            
//    default:
            
//        return null;
            
//        break;
            
//}
        }
    }

  调用方代码

  

 

<!--<br/ /><br/ />Code highlighting produced by Actipro CodeHighlighter (freeware)<br/ />http://www.CodeHighlighter.com/<br/ /><br/ />--> public void Caller3()
        {
            Animal a 
= AnimalFactory.GetInstance () .CreateAnimal ("cat");
            a.MakeSound();
        }

 

  我们先创建一个字典,作为容器,预先放置了全部的类型及其类型名称,然后再需要的时候取一个出来就可以了。如果有新类型添加,也不用每次都添加一个if或者是case了,只要修改工厂方法的静态构造函数,在字典中添加新元素就可以了。

  这时候有些人会觉得这里好像很眼熟,对了,就是容器,IOC容器,依赖注入,我们不知不觉的重构到了IOC容器。IOC容器就是一个类似字典的东西,使得你事先可以注册很多的类型在里面,设置好这些类型的映射关系,配置好容器之后,容器中就会有很多的类型实例,然后再用容器的Resolv方法来获取指定类型的实例,而不用new方法来创建了。

  而且上面最后的工厂类,我们还使用了单件模式以及简单工厂模式。

  类型的注册可以采用代码编写,就好像向字典中添加元素一样。也可以采用xml配置文件,更加灵活。

  

分享到:
评论

相关推荐

    对话框乱弹的小程序源码

    标题中的“对话框乱弹的小程序源码”指的是一个编程项目,它利用MFC(Microsoft Foundation Classes)库在VC++环境中编写,目的是创建一个整人性质的程序。这个小程序一旦运行,用户点击“开始”按钮后,会在Windows...

    乱弹爱丽丝钢琴曲谱双手数字简谱.pdf

    《乱弹爱丽丝》是一首深受广大音乐爱好者喜爱的钢琴曲,它的简谱版本为演奏者提供了方便,使得无论是初学者还是有一定基础的琴友都能尝试演奏这首曲子。在简谱中,数字代表音高,不同位置的数字对应钢琴键盘上的不同...

    Python-使用fiddler工具进行抓包使用python进行osc乱弹抢沙发

    使用fiddler工具进行抓包,使用python进行osc乱弹抢沙发

    《浅析新媒介生态环境下广播娱乐节目的编辑特征——以FM101.1西安乱弹“刘翔来了”为例》-论文.zip

    这篇论文《浅析新媒介生态环境下广播娱乐节目的编辑特征——以FM101.1西安乱弹“刘翔来了”为例》深入探讨了在新媒体环境下,广播娱乐节目如何适应和利用新媒介特性,实现自身内容创新与传播效果的提升。通过对FM101...

    《浅析新媒介生态环境下广播娱乐节目的编辑特征——以FM101.1西安乱弹“刘翔来了”为例》.doc

    《浅析新媒介生态环境下广播娱乐节目的编辑特征——以FM101.1西安乱弹“刘翔来了”为例》这篇文档探讨了在新媒体环境下广播娱乐节目编辑的新特点,以陕西地方电台“刘翔来了”为例进行深入分析。广播节目在传统媒介...

    《浅析新媒介生态环境下广播娱乐节目的编辑特征——以FM101.1西安乱弹“刘翔来了”为例》.zip

    《浅析新媒介生态环境下广播娱乐节目的编辑特征——以FM101.1西安乱弹“刘翔来了”为例》.zip

    into沙龙第期康国庆乱弹传统企业转型以及与互联网结合的方式PPT教案.pptx

    随着信息技术的飞速发展,互联网已经深入到社会的各个角落,对各行各业产生了深远影响。传统企业面临着前所未有的挑战和机遇,如何在变革的大潮中找到自己的位置,实现成功转型并与互联网紧密结合,是当前众多企业家...

    VB恶搞程序 对话框不断弹出 关不完的窗口.rar

    这个“VB恶搞程序 对话框不断弹出 关不完的窗口”实际上是一个利用VB语言编写的趣味程序,它的目的是通过不断的弹出消息框来恶搞用户。在程序设计中,这种不断弹窗的效果通常是通过循环结构和消息对话框函数实现的。...

    Z-Blog博客系统 2.2 Prism Build 130801

    Z-Blog博客系统是一款很好的一款博客系统,该系统源码比较简单,附件增强:增强附件功能,统计附件下载次数,防盗链等。高级侧栏:加几个新侧栏上去,微信公众平台,Z-Blog连接微信公众平台,静态管理中心,控制...

    免费教程大型网站整理.docx

    文档中还提到了一些提供工具和资源的网站,如织梦乱弹,它提供了关于网页设计和开发的各种资源和工具。 【总结】 这个文档是一份详尽的免费教程网站列表,对于想在网络技术、设计、编程等领域自我提升的个人来说,...

    动软代码生成器 修复单类代码生成器4个问题。

    修复单类代码生成器4个问题。 2.新增创建加载数据库时,表名过滤功能。 3.表名生成命名规则,字符串替换功能。 4.模板中字段排序方法公开。 5.字段默认值函数的处理。 6.导出的sql脚本中,单引号 '的问题。...

    Ajax使用杂谈 也许也是乱弹

    Ajax,即Asynchronous JavaScript and XML,是一种用于创建快速动态网页的技术。它的出现,尤其是在Google Suggest和Google Map等应用中的运用,对Web开发领域产生了深远影响。Ajax的核心是利用JavaScript来实现页面...

    维宏软件Ncstudio_V5.4.55_中文

    6. **多语言支持**:本版本为中文版,特别适合中国用户使用,界面语言清晰,便于理解和操作。 7. **版本更新**:从V5.4.49到V5.4.55的版本更新可能包含了性能优化、bug修复和新功能的添加,提升了软件的稳定性和...

    国粹京剧-彩色-PPT模板.pptx

    它起源于清朝乾隆五十五年(1790年),当时四大徽班(三庆、四喜、春台、和春)进京,与昆曲、汉剧、乱弹等剧种融合,经过五十至六十年的发展,最终演变成为京剧。京剧的名字最早在清光绪二年(1876年)的申报中出现...

    八木天线原理

    文件列表中的“八木天线乱弹(一)原理篇”似乎是一系列介绍八木天线原理的资料,可能包含天线的设计、计算方法、制作步骤以及实际应用等内容。例如,“页面_01.jpg”可能是介绍八木天线基本结构的图解,“页面_05....

    阿尔法虚拟桌面软件v2.0.1绿色版

    阿尔法虚拟桌面软件是一款桌面工具老板同事来身后了,不想被他们知道自己正在打理网店?有事离开电脑一会儿,不想被别人知道自己正在干嘛?使用软件群发时乱弹窗口很讨厌?一个桌面打开程序太多放不下了?您可以使用...

    掏钱学Ext(完整版) 附全部源码

    6.1. 有了它,我们就可以摆脱那些自称ui设计师的人了。 6.2. 关于BorderLayout 6.3. 嗯,不如再看看附加效果 6.3.1. 先看看split 6.3.2. 再试试titlebar 6.3.3. 还不够,还不够,让四周的区域可以缩起来 ...

    八年级地理下册黄土高原区域发展与居民生活.pptx

    黄土高原位于中国北方,是八年级地理课程中一个重要的学习区域。该地区的地理环境、居民生活以及区域发展是教学的重点。黄土高原以其独特的地貌特征——深厚的黄土层著称,这种土壤直立性良好,非常适合建造窑洞,...

Global site tag (gtag.js) - Google Analytics