设计模式: 单列设计模式 、模块方法设计模式、装饰设计模式、工厂设计模式、适配器设计模式
面向对象的思想:
单一
开闭
里氏
依赖注入
接口
迪米特
设计模式:就是一种设计的经验的总结,有 创建、 行为、 结构 三种。
一、单列设计模式
1、设计模式:解决某一类问题的最行之有效的方法。
2、Java中有23中基本设计模式。
3、单列设计模式:一个类在内存中只有一个对象。
为了达到单列设计模式,如下考虑:
1、 为了避免其他程序过多建立该类对象,所以要先禁止其他程序建立该类对象。
2、 但是为了有一个该类对象可用,所以只有通过自己建立一个本类对象。
3、 为了让其他程序使用该对象,所以要对外提一些访问方式。
有了上述思考,于是有了如下步骤:
1、 将其构造私有化 (使用 private 修饰构造函数)
2、 在类中 new 一个本类对象。
3、 提供一个 static 方法能调用到上步建立的对象。
代码示例如下:
class Single //饿汉式 (饿汉式在开发时更常用)
{
private Single(){}
private static Single s = new Single();
public static Single getInstans()
{
return s;
}
}
class Single //懒汉式
{
private static Single s;
private Single(){}
public static Single getInstance()
{
if(s==null)
s = new Single();
return s;
}
}
class Test
{
public static void main(String []args)
{
Single ss = Single.getInstans();
}
}
二、模板方法设计模式
在定义功能时,部分功能时确定的, 部分功能时不确定的, 而确定功能在使用不确定的功能,
我们就可以将不缺定的功能暴露出去,由子类去完成。
而确定部分就使用 final封装起来。
三、装饰设计模式:
描述:
当想要对已有对象的功能进行加强的时候,可以定义类: 该类传入已有对象为参数,并基于已有对象的功能,提供更加强大的功能。
那么,自定义的该类就是装饰类。
装饰类通常会在构造函数中接受被装饰的对象,并基于被装饰的对象的功能提供更强大的功能。
和继承的区别:
继承体系 Futher
|---Son1 extends Futher
|--- SuperSon1 extends Son1
|---Son2 extends Futher
|--- SuperSon2 extends Son2
|---Son3 extends Futher
|--- SuperSon3 extends Son3
装饰体系 Futher
|---Son1
|---Son2
|---Son3
|---class Super extends Futher
{
private Futher f;
public Super(Futher f)
{
this.f= f;
}
}
相比于继承,装饰模式比继承有更多的灵活性,避免了继承模式的臃肿。减低了类与类之间的关系。
装饰因为是增强已有对象,具备的功能和已有的是相同的,只是提供了更强大的功能。
所以装饰类和被装饰类通常都属于一个体系。
四、简单工厂模式
又叫静态工厂模式,其定义个静态工厂类,负责创建一些类的实例(一类对象一个工厂)。
优点:
客户端不需要负责对对象的创建,从而明确了各个类的职责。
缺点:
这个静态工厂负责对所有的类的创建,如果有新的对象的增加,或者某些对象的创建方式不同,就需要不断的修改工厂,不利于后期维护。
五、工厂方法模式:
工厂方法模式中抽象工厂类负责定义创建对象的接口,具体对象的创建工作由继承抽象工厂的继承类实现(每种对象一个工厂)。
优点:
客户端不需要再负责对象的创建从而明确了各个类的职责,如果有新的对象增加,只需要增加一个具体的类和一个具体的工厂类即可。
不影响已有代码,后期维护容易,增强了系统的扩展性。
缺点:
需要额外的代码编写,增加了工作量。
六、适配器模式:
对于一个有多个抽象方法的接口,有一个具体的类要实现此接口中的某一项功能,如果直接实现了该接口就会被要求实现其所有的抽象的功能。
这显然不太合适,所以:
我们写了一个实现该接口的Adapter类,该类空值的实现了接口中的所有功能, 我们只需要继承该Adapter类就可以让我们只复写其中的我们
所需要的功能了。 这个Adapter类就叫适配器。
七、代理模式
1.1、代理模式
什么是代理模式及其作用
Proxy Pattern(即:代理模式),23种常用的面向对象软件的设计模式之一
代理模式的定义:为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,
一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客
户端和目标对象之间起到中介的作用。
优点:
(1).职责清晰
真实的角色就是实现实际的业务逻辑,不用关心其他非本职责的事务,
通过后期的代理完成一件完成事务,附带的结果就是编程简洁清晰。
(2).代理对象可以在客户端和目标对象之间起到中介的作用,这样起到了的作用和保护了目标对象的作用。
(3).高扩展性
结构
一个是真正的你要访问的对象(目标类),另一个是代理对象,真正对象与代理
对象实现同一个接口,先访问代理类再访问真正要访问的对象。
1.2、动态代理
动态代理它可以直接给某一个目标对象生成一个代理对象,而不需要代理类存在。
动态代理与代理模式原理是一样的,只是它没有具体的代理类,直接通过反射生成了一个代理对象。
动态代理生成技术:
1. jdk提供一个Proxy类可以直接给实现接口类的对象直接生成代理对象。
2. cglib (spring)
Java.lang.reflect.Proxy类可以直接生成一个代理对象
Proxy.newProxyInstance():产生代理类的实例。仅能代理实现至少一个接口的类
ClassLoader:类加载器。固定写法,和被代理类使用相同的类加载器即可。
Class[] interface:代理类要实现的接口。固定写法,和被代理类使用相同的接口即可。
InvocationHandler:策略(方案)设计模式的应用。如何代理?
InvocationHandler中的invoke方法:调用代理类的任何方法,此方法都会执行
Object proxy:代理对象本身的引用。一般用不着。
Method method:当前调用的方法。
Object[] args:当前方法用到的参数