黑马程序员_设计模式总结

时间:2023-02-19 16:12:42

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

 
设计模式:把软件行业中出现的问题进行抽取并解决。总共有23种。
对问题行之有效的解决方式,其实它是一种思想。
 ---------------------------------------------------------------------------------------------------------------------------------------
设计模式可以分为三类:behavioural, structural, creational
behavioural 11 种
1. Memento(备忘录)
    精巧程度: 5星
    应用广泛:2星
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到保存的状态。
2. Chain of Responsibility(责任链)
    精巧程度: 3星
    应用广泛: 3星
为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它。
适合用在"一系列handler"的场景下。分为纯和不纯两种,好像女孩儿也可以这么分?
3. Observer(观察者)
定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。
因为java里有Obserable和Observer, 所以通常在java里不会自己设计观察者模式。
4. Command(命令模式)
    精巧程度:4星
    应用广泛:3星
将一个请求封装为一个对象,从而可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可取消的操作。
command模式用来解耦invoker和receiver.
5. State(状态模式)
    精巧程度:4星
    应用广泛:3星
允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它所属的类。
OO编程如果出现多个相同的if…else条件,应该考虑用state模式重构。work flow的状态器也是基于State模式的。
6. Interpreter(解释器)
    精巧程度: N/A
    应用广泛: 1星
给定一个语言,定义它的语法的一种表示,并定义一个解释器,该解释器使用该表示解释语言中的句子。
7. Strategy(策略模式)
    精巧程度: 2星
    应用广泛:4星
定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法的变化可独立于使用它的客户。
8. Iterator(迭代子)
    Java Collection都可以迭代,在java上不需要格外设计iterator.
9. Template Method(模板方法)
    精巧程度:2星
    应用广泛:4星
    见名知义。太简单了,学过一遍就不会忘。但是这个应用非常广泛!
10. Mediator(仲裁者)
    精巧程度:4星
    应用广泛:1星
    用来解耦多个peer.个人觉得这个模式多半会让mediator十分臃肿,mediator本身需要有很清晰的设计才能使用。应用场景恐怕也少。
11. Visitor(访问者)
    精巧程度:5星
    应用广泛:2星
    collection里存一个类系的entry时,使用visitor模式可以避免instance of的使用。更重要的是方便扩展类系。
    Structure 7种
12. adapter(适配器)
    精巧程度:2星
    应用广泛:1星
    将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的类可以一起工作。
13. Proxy(代理)
    精巧程度:2星
    应用广泛:5星
    aop是代理模式的一种发挥。Spring和Hibernate都大量使用proxy.可以引申学学JDK的dynamic proxy.模式简单,略。
14. Bridge(桥梁)
    精巧程度: 5星
    应用广泛: 3星
    Bridge在技术上是strategy的进一步发挥,但侧重在实现与抽象的解耦。
    将抽象部分与它的实现部分分离,使它们都可以独立地变化。
15. Composite
    精巧程度: 4星
    应用广泛: 3星
    适用于树状结构。
16. Decorator(装饰)
    精巧程度: 5星
    应用广泛:3星
    在java I/O中广泛使用。为了解决"类爆炸"的问题。
17. Facade(门面)
  连个UML图都没有,算神马模式?
18. Flyweight
    精巧程度:5星
    应用广泛:2星
    分"单纯""复合"两种,本身包含了工厂方法模式。一系列对象如果他们都有某部分属于特定集合,就让他们共享这个特定集合以节省资源。
    Creational 6 种
19. Factory Method(工厂方法)
    精巧程度:3星
    应用广泛:4星
    两个变种,一个是根据参数创建对象,一个是factory类系对应产品类系。面向接口编程在创建模式的体现。
20. Abstract Factory(抽象工厂)
    精巧程度:5星
    应用广泛:1星
    只有产品有两个类系的时候才用得上。
21. Builder
    精巧程度: 5星
    应用广泛: 2星
    产品分部分,并且build的过程不定的时候考虑用这种模式。是模板模式的一种发挥
22. Prototype(原型)
    java有cloneable的支持,所以通常不需要自己设计prototype. java用prototype的时候注意深复制浅复制的问题。
prototype之外的一个选择是提供一个constructor接受本类型对象作为参数,这个方式更加实用!
23. singleton(单例)
    保证一个类仅有一个实例,并提供一个访问它的全局访问点。
--------------------------------------------------------------------------------------
 单例设计模式:
 
 解决的问题:可以保证一个类在内存中的对象唯一性。
 比如对于多个程序使用同一个配置信息对象时,就需要保证该对象的唯一性。
 
 如何保证对象唯一性呢?
 1.不允许其他程序用new创建该类对象。
 
 2.在该类中创建一个本类实例。
 
 3.对外提供方法,让其他程序可以获取该对象。

 步骤:
 1.构造函数私有化
 2.通过new在本类中创建本类的对象。
 3.定义一个共有的方法将创建的对象返回。

/**
* 饿汉式
* @author 张熙韬
*
*/
class Single{
private Single(){};
private static final Single instance=new Single();
public static Single getInstance(){
return instance;
}
}


-------------------------------------------------------------------------------
/**
* 懒汉式
*/
class Single{
private Single(){};
private static Single s=null;

/*//同步方法比较低效率
public static synchronized Single getInstance(){
if(s==null){
s=new Single();
}
return s;
}*/

/**高效的同步方法的饿汉式
1.静态的同步函数使用的锁是:该函数所属的字节码文件对象。
2.懒汉式可以延迟加载
3.多线程访问会出现安全问题,需采用同步代码块!
*/
public static Single getInstance(){
if(s==null){
synchronized (Single.class) {
if(s==null){
s=new Single();
}
}
}
return s;
}

}
 ------------------------------------------------------------
装饰设计模式和继承都可以实现功能的扩展增强。
 
特点:装饰类和被装饰类都必须所属于同一个接口或者父类。

 一、装饰设计模式:

当想要对已有的对象进行功能增强时,

可以定义类,将已有对象传入,基于已有的功能,并提供加强功能。

那么自定义的该类称为装饰类。

装饰类通常会通过构造方法接收被装饰的对象。

并基于被装饰的对象的功能,提供更强的功能。


二、装饰设计模式和继承的区别

MyReader//专门用于读取数据的类。
 |--MyTextReader
  |--MyBufferTextReader
 |--MyMediaReader
  |--MyBufferMediaReader
 |--MyDataReader
  |--MyBufferDataReader


class MyBufferReader
{
 MyBufferReader(MyTextReader text)//这种方式需要定义多个构造方法,所以扩展性很差
 {}
 MyBufferReader(MyMediaReader media)
 {}
}


上面这个类扩展性很差。

找到其参数的共同类型(即都是继承都一个父类)。通过多态的形式。可以提高扩展性。

class MyBufferReader extends MyReader
{
 private MyReader r;
 MyBufferReader(MyReader r)//多态,将父类引用传递进来,对子类进行增强
 {}


MyReader//专门用于读取数据的类。
 |--MyTextReader
 |--MyMediaReader
 |--MyDataReader
 |--MyBufferReader//增强的类


以前是通过继承使每一个子类都具备缓冲功能。那样继承体系会复杂,并不利于扩展。

现在优化思想。单独描述一下缓冲内容。

将需要被缓冲的对象。传递进来,也就是谁需要被缓冲,谁就作为参数传递给缓冲区(抽象为共同的父类)。

这样继承体系就变得很简单。优化了体系结构。

装饰的好处:装饰模式比继承要灵活。避免了继承体系臃肿,而且降低了类于类之间的关系。

装饰类因为增强已有对象所具备的功能,所以已有的功能是相同的,只不过提供了更强功能。

所以装饰类和被装饰类通常是同属于一个体系的。

例:

public class Demo9 {  
public static void main(String[] args) {
Person p = new Person();
//p.chifan();
NewPerson p1 = new NewPerson(p);
p1.chifan();
}
}
class Person{
void chifan(){
System.out.println("吃饭");
}
}
//这个类的出现是为了增强Person而出现。
class NewPerson{
private Person p;
NewPerson(Person p){
this.p = p;
}
void chifan(){
System.out.println("开胃酒");
p.chifan();
System.out.println("甜点");
}
}

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------