设计模式(学以致用)(怎么样让自己的大脑就范)

用模式思考(什么情况下用模式,什么情况下不用模式)

 

保持简单(用最简单的方法去解决问题。)

 

要知道何时需要模式……

 

重构时间就是模式时间

 

拿掉你所不需要的,不要害怕一个模式充你的设计中删除

 

如果你现在不需要,就别做。

 

 

反模式 :告诉你采用一个不好的解决方案解决一个问题。

Java版模式速查手册

云认知:你想怎么才能骗过自己的大脑,让我的大脑记住。把自己的神经点火。

怎么样让自己的大脑就范:

1.慢一点,你看的越多,记住的越少。时不时的停下来,深深的思考一番。

2.勤做练习题,做笔记。

3.上床睡觉前千万别看难懂的书或者学习难懂的知识。随便读。

4.要喝水,多喝水。

5.大声的说出来吧。

6.听听你的大脑怎么说吧:感觉自己的大脑动不起来时,应该休息休息了。

7.要有感觉。

9.设计一些东西。

 

 

 

head first的学习原则:

1.看得到(图,视频加文字)

2.采用一种针对个人的交谈方式

3.让学习的人想的更深

4.引起我的注意,并且一直注意下去

5.影响我的情绪

 

 

雷军:

建议一、只有真正喜欢才能写好程序

 

建议二、把程序当艺术品,象写诗一样来写代码

 

建议三、必须写够十万行代码,不要心存侥幸

 

建议四、时刻保持好奇心

 

建议五、不要局限在技术本身,多花点精力关注用户

 

 

OO基础 :抽象、封装、继承、多态

OO原则

  •   封装变化——找出应用中可能需要变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起。
  •   针对接口编程,而不是针对实现编程。
  • 多组合,少用继承。
  • 为了交互对象的松耦合设计而努力。
  • 对扩展开放,对修改关闭(我想这是相对于类来说的)
  • 依赖抽象,不依赖具体类
  • 最少知识原则:只和你的密友谈话

 

有一个和是一个的意思:有一个可能是某个抽象类中有一个接口,是一个可能是某个类继承了某个抽象类。

有一个可能比是一个更好。

 

代码重用(继承),提高维护性和可扩展性。

OO模式

 

创建型—— Singleton(单例模式)

 

名称Singleton
结构
意图保证一个类仅有一个实例,并提供一个访问它的全局访问点。
适用性
  • 当类只能有一个实例而且客户可以从一个众所周知的访问点访问它时。
  • 当这个唯一实例应该是通过子类化可扩展的,并且客户应该无需更改代码就能使用一个扩展的实例时。

 

创建型——FactoryMethod(工厂方法) :定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类。

 

名称Factory Method
结构
意图定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类。
适用性
  • 当一个类不知道它所必须创建的对象的类的时候。
  • 当一个类希望由它的子类来指定它所创建的对象的时候。
  • 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。

 

创建型——Abstract Factory(抽象工厂) :提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

举例说明:

产生鸭子的抽象工厂,这些鸭子都继承同一个接口(Quackable)

public interface Quackable {
	public void quack();
}

public abstract class AbstractDuckFactory {
 
    public abstract Quackable createMallardDuck();
    public abstract Quackable createRedheadDuck();
    public abstract Quackable createDuckCall();
    public abstract Quackable createRubberDuck();
}


public class CountingDuckFactory extends AbstractDuckFactory {
 
    public Quackable createMallardDuck() {
        return new QuackCounter(new MallardDuck());
    }
 
    public Quackable createRedheadDuck() {
        return new QuackCounter(new RedheadDuck());
    }
 
    public Quackable createDuckCall() {
        return new QuackCounter(new DuckCall());
    }
  
    public Quackable createRubberDuck() {
        return new QuackCounter(new RubberDuck());
    }
}



AbstractDuckFactory duckFactory = new CountingDuckFactory();
 

 

 

名称Abstract Factory
结构
意图提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
适用性
  • 一个系统要独立于它的产品的创建、组合和表示时。
  • 一个系统要由多个产品系列中的一个来配置时。
  • 当你要强调一系列相关的产品对象的设计以便进行联合使用时。
  • 当你提供一个产品类库,而只想显示它们的接口而不是实现时。

 

行为型—— Strategy 策略模式对象行为型模式,主要是定义一系列的算法,把这些算法一个个封装成单独的类.

比喻:鸭子类中鸭子们可能会飞,也可能不会飞,所以就不能不飞放在鸭子里,将其对立开来。

 

名称Strategy
结构
意图定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。
适用性
  • 许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法。
  • 需要使用一个算法的不同变体。例如,你可能会定义一些反映不同的空间/时间权衡的算法。当这些变体实现为一个算法的类层次时[ H O 8 7 ] ,可以使用策略模式。
  • 算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的、与算法相关的数据结构。
  • 一个类定义了多种行为, 并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的S t r a t e g y 类中以代替这些条件语句。

 

通俗理解:

策略模式:策略,顾名思义,就是面对客户的需求或者是未来的需求,但有些需求是可以大概预测的,但是也有我们

未知的变化,但是一般情况下这个变化是可以限定的。比如鸟儿会叫,但是不一定每个都会叫,这是一种行为,可以

有很多种叫法。所以我们用策略模式来解决他。

 

 

行为型——observer(观察者模式 ):

定义了对象之间的一对多依赖关系,这时,当一个对象改变状态时,他的所有依赖着就会收到通知并更新。

 

比喻:猎头+程序员 = 观察者模式    出版社+订阅者 = 观察者模式,一对多的关系,一个是带有状态的主题,其他是

使用这个主题的使用者

 

Observer
结构
意图定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。
适用性
  • 当一个抽象模型有两个方面, 其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。
  • 当对一个对象的改变需要同时改变其它对象, 而不知道具体有多少对象有待改变。
  • 当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之, 你不希望这些对象是紧密耦合的。

 

设计原理:为了交互对象的松耦合设计而努力。

 

 

结构型——Decorator(装饰者模式)

比喻:咖啡店里卖咖啡,咖啡杯是被装饰者,咖啡、糖、摩卡等为装饰着。

 

名称Decorator
结构
意图动态地给一个对象添加一些额外的职责。就增加功能来说,D e c o r a t o r 模式相比生成子类更为灵活。
适用性
  • 在不影响其他对象的情况下,以动态、透明的方式给单个对象添加职责。
  • 处理那些可以撤消的职责。
  • 当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况可能是因为类定义被隐藏,或类定义不能用于生成子类。

 

结构型——COMMAND(命令模式)

 

名称Command
结构
意图将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作。
适用性
  • 抽象出待执行的动作以参数化某对象,你可用过程语言中的回调(c a l l b a c k )函数表达这种参数化机制。所谓回调函数是指函数先在某处注册,而它将在稍后某个需要的时候被调用。C o m m a n d 模式是回调机制的一个面向对象的替代品。
  • 在不同的时刻指定、排列和执行请求。一个C o m m a n d 对象可以有一个与初始请求无关的生存期。如果一个请求的接收者可用一种与地址空间无关的方式表达,那么就可将负责该请求的命令对象传送给另一个不同的进程并在那儿实现该请求。
  • 支持取消操作。C o m m a n d 的E x c u t e 操作可在实施操作前将状态存储起来,在取消操作时这个状态用来消除该操作的影响。C o m m a n d 接口必须添加一个U n e x e c u t e 操作,该操作取消上一次E x e c u t e 调用的效果。执行的命令被存储在一个历史列表中。可通过向后和向前遍历这一列表并分别调用U n e x e c u t e 和E x e c u t e 来实现重数不限的“取消”和“重做”。
  • 支持修改日志,这样当系统崩溃时,这些修改可以被重做一遍。在C o m m a n d 接口中添加装载操作和存储操作,可以用来保持变动的一个一致的修改日志。从崩溃中恢复的过程包括从磁盘中重新读入记录下来的命令并用E x e c u t e 操作重新执行它们。
  • 用构建在原语操作上的高层操作构造一个系统。这样一种结构在支持事务( t r a n s a c t i o n )的信息系统中很常见。一个事务封装了对数据的一组变动。C o m m a n d 模式提供了对事务进行建模的方法。C o m m a n d 有一个公共的接口,使得你可以用同一种方式调用所有的事务。同时使用该模式也易于添加新事务以扩展系统。

 

 

结构型——Adapter(_class,_object)适配器

 

比如:一个美国带回来的电脑,中国的插头不是和它用,这是就要有个适配器来转换电源。

 

名称Adapter
结构

意图将一个类的接口转换成客户希望的另外一个接口。A d a p t e r 模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
适用性
  • 你想使用一个已经存在的类,而它的接口不符合你的需求。
  • 你想创建一个可以复用的类,该类可以与其他不相关的类或不可预见的类(即那些接口可能不一定兼容的类)协同工作。
  • (仅适用于对象A d a p t e r )你想使用一些已经存在的子类,但是不可能对每一个都进行子类化以匹配它们的接口。对象适配器可以适配它的父类接口。

 

 

结构型——Facade (外观模式)

 

比喻:一堆零散的个体,比如音箱、DVD、液晶电视……,我如果要看家庭影院,就需要一个一个的将他们开启来,

我的家庭影院才可以开始,这是我们就可以想象我们的模式中,外观模式非常适合。

 

名称Facade
结构
意图为子系统中的一组接口提供一个一致的界面,F a c a d e 模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
适用性
  • 当你要为一个复杂子系统提供一个简单接口时。子系统往往因为不断演化而变得越来越复杂。大多数模式使用时都会产生更多更小的类。这使得子系统更具可重用性,也更容易对子系统进行定制,但这也给那些不需要定制子系统的用户带来一些使用上的困难。F a c a d e 可以提供一个简单的缺省视图,这一视图对大多数用户来说已经足够,而那些需要更多的可定制性的用户可以越过f a c a d e 层。
  • 客户程序与抽象类的实现部分之间存在着很大的依赖性。引入f a c a d e 将这个子系统与客户以及其他的子系统分离,可以提高子系统的独立性和可移植性。
  • 当你需要构建一个层次结构的子系统时,使用f a c a d e 模式定义子系统中每层的入口点。如果子系统之间是相互依赖的,你可以让它们仅通过f a c a d e 进行通讯,从而简化了它们之间的依赖关系。

 

行为型:Template Method(模板方法)

 

设计原则:别找我,我会找你。

 

例子:咖啡和茶的制作步骤,这里的步骤就可以作为模板方法。

 

设计模式迷你手册 ---- RedSword软件工作室

名称Template Method
结构
意图定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Te m p l a t e M e t h o d 使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
适用性
  • 一次性实现一个算法的不变的部分,并将可变的行为留给子类来实现。
  • 各子类中公共的行为应被提取出来并集中到一个公共父类中以避免代码重复。这是O p d y k e 和J o h n s o n 所描述过的“重分解以一般化”的一个很好的例子[ O J 9 3 ]。首先识别现有代码中的不同之处,并且将不同之处分离为新的操作。最后,用一个调用这些新的操作的模板方法来替换这些不同的代码。
  • 控制子类扩展。模板方法只在特定点调用“h o o k ”操作(参见效果一节),这样就只允许在这些点进行扩展。

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值