设计模式原则
- 单一职责原则:一个类和一不个接口只负责唯一的职责,尽量设计功能单一的接口
- 依赖倒转原则:高层模块不应该依赖于底层模块的实现,解耦高层模块与底层模块,即面向接口编程,当实现发生变化时,只提供新的实现类,不需要修改高层模块代码。
- 开放封闭原则:对扩展开放,对修改关闭,换句话说,当需求发生变化是,可以通过添加新模块来满足新需求,而不是修改原有代码
- 里氏替换原则:子类可以扩展父类的功能,但不能改变父类原有的功能。,在软件中将基类对象替换为他的子类对象,程序不会产生任何错误,反过来不成立。
- 接口隔离原则:使用多个隔离的接口,比使用单个接口好,降低了接口之间的耦合度和依赖,方便维护和升级
- 合成复用原则:尽量使用组合/聚合的方式,而不是使用继承
代理模式
定义:给目标对象提供一个代理对象,并由代理对象控制对目标对象的引用
目的:1. 通过代理对象间接访问目标对象,防止直接访问目标系统带来的不必要复杂性。2.通过代理对象对原有的业务增强。
/**创建一个业务接口和业务的实现类。*/
public interface womanToolsFactory {
void saleWomanTools(double length);
}
public class BFactory implements womanToolsFactory{
@Override
public void saleWomanTools(double length) {
System.out.println("提供一个身高为:"+length+"的模特");
}
}
/**创建一个类实现InvocationHandler接口并重写invoke方法。*/
public class LisiHandler implements InvocationHandler {
private Object target;
public LisiHandler(Object target) {
this.target = target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
dosomeThingBefore();
Object result = method.invoke(target, args);
dosomeThingAfter();
return result;
}
private void dosomeThingAfter() {
System.out.println("精美包装,快递一条龙");
}
private void dosomeThingBefore() {
System.out.println("根据需求,进行市场调研");
}
}
/**调用Proxy.newProxyInstance方法生成动态代理类的class字节码并返回动态代理类的实例。*/
/**客户端调用动态代理类的具体业务方法*/
public static void main(String[] args) {
System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles", "true");
// 被代理对象
BFactory bFactory = new BFactory();
// 被代理对象类加载器
ClassLoader classLoader = bFactory.getClass().getClassLoader();
// 被代理对象接口集合
Class<?>[] interfaces = bFactory.getClass().getInterfaces();
// 请求处理器, 处理所有的代理对象上的方法调用
LisiHandler lisiHandler = new LisiHandler(bFactory);
// 创建代理对象
womanToolsFactory proxy=(womanToolsFactory)Proxy.newProxyInstance(classLoader, interfaces, lisiHandler);
// 调用代理的方法
proxy.saleWomanTools(1.8);
}
单例模式
//D:\java\javademo\singleton
//双重校验 +volatile 对写操作加入了内存屏障,禁止了指令重排序
public class Singleton7DCLVolatile {
private static volatile Singleton7DCLVolatile instance;
private Singleton7DCLVolatile(){}
public static Singleton7DCLVolatile getInstance(){
if(instance==null){
synchronized (Singleton7DCLVolatile.class){
if(instance==null){
instance=new Singleton7DCLVolatile();
}
}
}
return instance;
}
}