第三章 设计模式入门

第三章 设计模式

核心是解耦合提高复用性

列举面向对象设计原则并说明核心思想

1.单一职责

2.开闭原则

3.里式替换原则

4.依赖倒置原则

5.接口隔离

6.地雷特法则

7.合成复用原则

 

代理模式的作用

 

 

设计模式简介

对某些特定问题的经过实践检查的特定解决方法,应用在Java框架技术中

优点 复用,便于团队交流

 

设计模式分类

GoF(四人组)设计模式

分为23钟

范围目的创建型模式j结构型模式行为型模式
类模式 工厂方法 (类)匹配器 模板方法 解释器
对象模式 单例 原型 抽象工厂 建造者 代理 (对象)适配器 桥接 装饰 外观 享元 组合 策划

 

 

列举面向对象设计原则并说明核心思想

1.单一职责

1.一个类应该有且仅有一个引起他变化的原因

2.一个类应该只负责一个职责

2.开闭原则

1.对扩展开放,对修改关闭

  1. 面向抽象接口开发,不面对具体事例类开发

  2. 添加实现类,而不是修改类

3.里式替换原则

  1. 引用基类的地方必须能透明使用其子类的对象

  2. 可以用来判断继承关系是否合理

4.依赖倒置原则

  1. 依赖于抽象而不依赖于具体实现,针对接口编程

5.接口隔离

1.尽量将庞大的接口拆分成更小的 更具体的接口

2.接口中只包含感兴趣的方法

6.迪米特法则 (最少知道原则)

1.尽可能地于减少其他实体发生互相作用

7.合成复用原则

1.尽量使用组合/聚合的方式,而不是继承关系

2.has-a关系

 

设计模式的应用

简单工厂模式

工厂 负责创建所有实例 根据传入的参数

抽象产品

具体产品

 

优点

1.基于多台,便于对负责逻辑进行封装管理

2.满足开闭原则

缺点复杂

代理模式

1.单一职责原则的体现

2.包含抽象主题 真实主题 代理

3.实现方式总体分为静态代理和动态代理

静态代理由开发者针对抽象主题编写相关的代理实现,编译之前生成代理类的.class文件
动态代理实在运行时动摇生成的,在运行时动态生成代理类字节码

 

静态弊端

增加代码量且不符合开闭原则

动态代理

优点

1.提供了运行时动态扩展对象行为的能力

2.能够根据给定的业务规则,在运行时生成代理类

核心API

 

方法介绍
Object invoke(Object target,Method method,Object[] args) 用于在代理实例上处理方法调用并返回结果。target代理正在执行方法的对象,正在被调用的接口方法,args传递给接口方法 的参数。
static Object newProxyInstance(ClassLoader loader,Class<?>[]interfaces,InvocationHandler h) 返回一个实现了指定接口的代理实例,对接口方法的调用会被指派掉指定的调用处理程序。loader用来加载动态生成的代理类,h是接口代理方法的调用处理程序,interfaces需要进行代理的接口类型

 

动态代理框架

抽象主题类

public interface Buyer {//抽象主题类
   String add();//看房方法

}
真实主题类
public class RealBuyer implements Buyer{//真实主题类
   @Override
   public String add() {
       System.out.println("买家看房,并给出意见!");
       return "";
  }
}

代理工厂类 创建一个create方法

import java.lang.reflect.Proxy;

public class IntermadiaryJDKProxyFactory {//代理工厂类
   public static <T> T create(Object object){
       IntermadiaryInvocationHandler handler = new IntermadiaryInvocationHandler();
       handler.setTarget(object);
       return (T)Proxy.newProxyInstance(object.getClass().getClassLoader(),object.getClass().getInterfaces(),handler);
  }
}

中介代理类

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class IntermadiaryInvocationHandler implements InvocationHandler {//实现代理对象
   private Object target;//被代理的对象

   public void setTarget(Object target) {//调用set方法
       this.target = target;
  }
   @Override
   public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
before();
       Object obj = method.invoke(target, args);
       after();
       return "看房记录:买家反馈"+obj;
  }
   public void before(){
       System.out.println("中介查看房源");
       System.out.println("中介和租客约好时间");
  }
   public void after(){
       System.out.println("中介写日志");
  }
}

测试类

public class Test {
   public static void main(String[] args) {
       Buyer buyer= IntermadiaryJDKProxyFactory.create(new RealBuyer());
       System.out.println(buyer.add());
  }
}

 

posted @ 2021-01-04 10:19  编码小高  阅读(70)  评论(0编辑  收藏  举报