Java设计方式学习笔记上
Java设计模式学习笔记上??FlyBehavior 和 QuackBehavior分别是算法族对象的接口; 客户中直接声明接口,使算
Java设计模式学习笔记上
?
?FlyBehavior 和 QuackBehavior分别是算法族对象的接口; 客户中直接声明接口,使算法独立,不影响客户,同时使算法方法得到重用;
?
另一示例:comparator 和comparable?
任何实现comparable接口的对象都能通过sort方法排序,同时可以通过策略模式选择每个对象的比较策略,可以为每个对象实现各自的Comparator方法。
?
三:观察者模式(observer)定义:在对象之间定义一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象都会受到通知,并自动更新。出版者+订阅者=观察者模式 ? ? 出版者1——*订阅者java内置观察者模式:
?
? ? ? ?观察者类 observable.class;
? ? ? 观察者接口Observer;
? ? ? 实现中subject类型的类需继承自observable.class;
? ? ? observer类型的对象需实现observer接口,实现update()
?
四:装饰者模式(Decorator)用途:在不修改任何底层代码的情况下,给你的(或别人的)对象赋予新的职责。特有原则:开放-关闭原则。但在应用中让OO每个地方都采用开放-关闭原则是一种浪费,一般在设计中找到最有可能改变的地方,然后应用开放-关闭原则。定义:装饰者模式动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。特性:装饰者和被装饰者有相同的超类。 可以用一个或多个装饰者逐层装饰一个对象。装饰者可以在所委托被装饰者的行为之前与/或之后,加上自己的行为,以达到特定的目的。Whip,Mocha,DarkRoast拥有同样的超类,whip和mocha对DarkRoast进行层层装饰
?五:工厂模式(Factory)设计原则:要依赖抽象,不要依赖具体类。又称依赖倒置原则工厂方法模式:定义了创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。抽象工厂模式:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定类型工厂方法模式与抽象工厂对比
?上例是简单工厂方法,在SimplePizzaFactory产生具体的Pizza产品。
?上例是工厂模式,不同的PizzaStore根据自己店的风格生产出不同的Pizza。
?上例是抽象工厂模式,每个工厂负责生产一个产品家族(我们可以设想成Pizza的产品原料)? ? ? 最后唠叨:工厂方法模式,只不过就是通过子类来创建对象。客户只需知道抽象类型,由子类负责决定具体类型。? ? ? 抽象工厂负责创建一个产品家族,这个类型的子类定义了产品被产生的方法。要想使用这个工厂,必须先示例化它,然后将它传入到一些针对抽象类型所写的代码中。缺陷:当加入新产品时,需要改变接口及接口相应的子类。
?
六:单例模式(Singletone)定义:确保一个类只有一个实例,并提供全局访问点。实现:在java实现中需要私有的构造函数、一个静态方法和一个静态变量 ? ??
?具体例子:设计一个遥控器API,有一个开关槽,负责管理各个电器的开关
? 定义Light等命令执行者,这里以Light为例? ?定义一系列命令对象,包装执行请求的对象,并定义execute()供RemoteControl进行调用,将RemoteControl和Light进行解耦。? ?定义 RemoteControlLoader 来装载各个命令对象,并封装一系列的命令请求,按下按钮进行测试
?在类适配器中,需要多重继承,在java中不可能。在对象适配器中利用组合的方式将请求传送给被适配者(在Adapter中声明Adaptee实例,并调用Adaptee的方法)定义-外观模式:提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。
?两者意图不同:适配器模式意在改变接口类型以符合客户的需求。而外观模式是提供子系统的一个简化接口,方便用户操作(类似于在一个新的接口中将子系统的一系列方法封装成另一个方法供用户使用,用户无需考虑中间都调用了哪些类;当然这些子系统的接口仍然存在供用户随时调用)