设计模式的总结:设计模式是使用类之间的继承,接口,类的聚合,组合关系,实现良好的扩展结构
创建模式
单例模式:创建单实例的方法
工厂模式,复杂对象的创建交由工厂实现,用户不用关心创建的过程
其中, 简单工厂模式,工厂根据传入的值不同,创建不同的对象
工厂模式:将工厂作为一个抽象的类,只有共性功能,个性化的工厂功能实现,交由子类的工厂实现
抽象工厂模式:工厂和创建的对象都是抽象方法,由子类去实现
建造者模式:对象的创建由derctor指引,实际的创建交由建造者,建造者聚合到derctor,创建的过程可以修改
原型模式:使用clone技术或者反序列化的方法,实现对象的克隆,也就是创建后的对象不会因为原来的对象修改而修改
行为模式: 适配器模式:间原由的类扩展为客户端希望的类 装饰者模式:对类原因的功能实现功能的增强 享元模式:分为共性的方法和个性的方法,个性的方法需要实现,聚合到工厂类,工厂类中由容器,对于已经创建的相同对象,只在容器中获取(线程私池) 代理模式:对原有的类进行功能扩张
行为模式: 模板模式;模板方法是抽象方法,有了模板实现方法,子类只要实现个性化的方法
观察者模式(被动触发观察者)在观察者有状态变化时,触发观察者的方法
策略模式(主动触发策略)直接使用聚合策略的方法
设计模式的原则: 1、单一职责原则(不同的功能模块由不同的类实现或者方法)(目的:减低类的复杂读,提高可读性,可维护性,降低变更出现问题的风险,通常情况下,需要)如果不是很复杂的程序,需要遵守单一原则 2、接口隔离原则 (每个类的依赖的(使用的)接口,里面的方法必须都是需要使用的,也就是接口里面的所有方法都是有用的) 底层代码接口,抽象类,变量,尽量使用接口(可以实现功能的扩展)
3、依赖倒转原则(面向接口编程,细节依赖抽象,而不是抽象依赖细节,低层级依赖高层级) 依赖的三种方式 接口实现 构造器实现 set方法实现 4、李氏替换原则 尽量减少对父类的重写,这样会减低程序的复用性,尤其是在多态频繁使用的场景
解决方法,将子类和父类继承更高级的父类,使用依赖,聚合组合的方式替代
5、开闭原则 (对扩展开发,对修改关闭)新的功能尽量增加新的代码而不是修改原来的代码,比如增加新的功能,创建新的类,传入固定的类,而不是改变固定的类
6、迪米特法则 对自己依赖的类,知道的越少越好,方法尽可能地封装到自己的类中,其他地类只需简单地调用 尽量不要出现直接地变量涉及到其他地类
7、合成复用原则(尽量使用合成聚合地方式,而不直接使用继承)也就是使用set方法,构造器方法或者new,来替代继承该类
unl 类间的关系: 依赖(a类用到了b,则a依赖b) 泛化(继承) 实现(接口实现) 关联(是否有定义成员变量) 聚合(类中只声明其他类)可分割 组合(类中创建了其他类)不可分割
设计模式的分类
设计模式的目的是提高软件系统的可维护性,扩展性,减低系统的代码复杂度
单例模式,工厂模式,抽象工厂模式,建造者模式,原型模式,修饰者模式,适配器模式,桥接模式,享元模式
单例模式
饿汉式(静态变量)
构造器私有化(防止new) 类的内部创建对象 向外暴露静态方法getinstance 优点:在类加载的时候创建,避免多线程问题,实现简单 缺点:类不一定只是在getinstance的时候才加载,可能浪费内存资源
方法说明,构造方法私有化是为了避免使用new方法创建多个对象,同时类的内部可以调用来创建对象;对外暴露的方法使用静态方法,保证可以访问该类的方法,
懒加载使用双重检查法
静态内部类实现单例模式
静态内部类在类加载的时候,是不会加载的,只有再条用方法的时候,实例对象才会执行
单例模式使用的场景:频繁使用的对象
工厂模式
简单工厂模式(对象的创建由工厂根据传入的标志类型而创建不同类型的工厂) 工厂根据传入的类型返回需要的对象,这个对象是频繁会被修改的, 其调用者是频繁被多个地方使用的,这样,使用的客户类和工厂是低耦合的,修改工厂的类,不需要大量去修改客户端的类
工厂模式;相对于简单工厂模式,将工厂作为一个抽象的类,只有共性功能,具体的工厂功能实现,交由子类的工厂实现,并将工厂组合到客户端类crder类中,相对于简单工厂模式,工厂模式为的工厂更有扩展性,调用具体的工厂实现功能,(客户端类抽象类,与工组合关于)
抽象工厂,工厂类是一个接口,有子类去实现,抽象接口,order类聚合抽象工厂(客户端类和工厂的接口聚合的关系)
使用场景: 1、当不知道使用的对象确切类型时 2、希望为框架提供扩展方法时
优点:
将具体产品和创建者解耦
符合单一职责原则
符合开闭原则
public class designermodal{
public static void main(String[] args) {
Application2 application2 = new createproductA();
Product product = application2.GetObject();
//这里的Product为多态,虽然执行的 product.method1();,但是会根据不同的实现类,执行不同的方法
product.method1();
}
}
interface Product {
public void method1();
}
abstract class Application2{
abstract Product creatproduct();
Product GetObject(){
Product product = creatproduct();
return product;
}
}
class createproductA1 extends Application2{
@Override
Product creatproduct() {
return new productA();
}
}
class createproductA extends Application2{
@Override
Product creatproduct() {
return new productB();
}
}
class productA implements Product{
public void method1(){
System.out.println("method1");
}
}
class productB implements Product{
public void method1(){
System.out.println("method2");
}
}
抽象工厂模式(工厂和工厂的方法都是接口,由新的需求,只需要实现这些方法) 优点: 1、可以确定,从工厂得到的方法,彼此是兼容的
2、可以避免客户端代码和产品的代码紧密耦合
3、符合单一职责原则
4、符合开闭原则
public class abstractfactory {
public static void main(String[] args) {
databaseutil idatabaseutil = new oracleDatabaseUtil();
Iconnection connection = idatabaseutil.getConnection();
connection.connect();
Icommand icommand = idatabaseutil.getIcommand();
icommand.command();
}
}
interface Iconnection{
void connect();
}
interface Icommand{
void command();
}
//抽象工厂模式,工厂方法接口(方法和类都是接口组成的)
interface databaseutil{
Iconnection getConnection();
Icommand getIcommand();
}
class MySqlConnection implements Iconnection{
@Override
public void connect() {
System.out.println("mysql connected.");
}
}
class MySqlCommond implements Icommand{
@Override
public void command() {
System.out.println("mysql command.");
}
}
class mysqlDatabaseUtil implements databaseutil{
@Override
public Iconnection getConnection() {
return new MySqlConnection();
}
@Override
public Icommand getIcommand() {
return new MySqlCommond();
}
}
class oracleconmand implements Icommand{
@Override
public void command() {
System.out.println("oracleconnect.");
}
}
class oracleconnect implements Iconnection{
@Override
public void connect() {
System.out.println("oracleconmand");
}
}
class oracleDatabaseUtil implements databaseutil{
@Override
public Iconnection getConnection() {
return new oracleconnect();
}
@Override
public Icommand getIcommand() {
return new oracleconmand();
}
}
建造者模式:(specialconcreateprobuider聚合到director,director获取参数,内部调用specialconcreateprobuider的创建方法创建对象)
优缺点: 用户不需要知道创建的复杂过程
使用场景: 不用知道建造过程,就可以构建不同的东西。在构建地图的过程中,也就是用户委托Director这个类去构建对象
对象的创建比较复杂, specialconcreateprobuider(负责创建需要的对象)个性化创建需要的构造者 director(负责传入参数)可以共用,知道对象的创建
优点:建造者独立,容易扩展
工厂方法和建造者方法的区别: 它们目的都是创建一个复杂的对象 工厂模式注重的是整体对象的创建方法,而建造者模式注重的是对象的创建过程,创建对象的过程方法可以在创建时自由调用。
package main.java;
public class productModel {
public static void main(String[] args) {
productbuilder specialconcreateprobuider = new specialconcreateprobuider();
Director director = new Director(specialconcreateprobuider);
product product = director.makeProductor("aa", "bb", "cc", "dd", "ee", "ee");
System.out.println(product);
}
}
class Director{
private productbuilder builder;
public Director(productbuilder builder) {
this.builder = builder;
}
public product
makeProductor(String productname, String productcompany, String part1, String part2, String part3, String part4){
builder.builderProductcompany(productname);
builder.builderProductname(productcompany);
builder.builderProductpart1(part1);
builder.builderProductpart2(part2);
builder.builderProductpart3(part3);
builder.builderProductpart4(part4);
product build = builder.build();
return build;
}
}
interface productbuilder{
void builderProductname(String Productname);
void builderProductcompany(String Productcompany);
void builderProductpart1(String part1);
void builderProductpart2(String part2);
void builderProductpart3(String part3);
void builderProductpart4(String part4);
product build();
}
class defualtconcreateprobuider implements productbuilder{
private String Productname;
private String Productcompany;
private String part1;
private String part2;
private String part3;
private String part4;
@Override
public void builderProductname( String Productname ) {
this.Productname =Productname;
}
@Override
public void builderProductcompany( String Productcompany) {
this.Productcompany =Productcompany;
}
@Override
public void builderProductpart1(String part1) {
this.part1 = part1;
}
@Override
public void builderProductpart2(String part2) {
this.part2 = part2;
}
@Override
public void builderProductpart3(String part3) {
this.part3 = part3;
}
@Override
public void builderProductpart4(String part4) {
this.part4 = part4;
}
@Override
public product build() {
return new product(this.Productname,this.Productcompany,this.part1,this.part2 ,this.part3, this.part4);
}
}
class specialconcreateprobuider implements productbuilder{
private String Productname;
private String Productcompany;
private String part1;
private String part2;
private String part3;
private String part4;
@Override
public void builderProductname( String Productname ) {
this.Productname =Productname;
}
@Override
public void builderProductcompany( String Productcompany) {
this.Productcompany =Productcompany;
}
@Override
public void builderProductpart1(String part1) {
this.part1 = part1;
}
@Override
public void builderProductpart2(String part2) {
this.part2 = part2;
}
@Override
public void builderProductpart3(String part3) {
this.part3 = part3;
}
@Override
public void builderProductpart4(String part4) {
this.part4 = part4;
}
@Override
public product build() {
return new product(this.Productname,this.Productcompany,this.part1,this.part2 ,this.part3, this.part4);
}
}
class product{
private String Productname;
private String Productcompany;
private String part1;
private String part2;
private String part3;
private String part4;
public product() {
}
public product(String productname, String productcompany, String part1, String part2, String part3, String part4) {
Productname = productname;
Productcompany = productcompany;
this.part1 = part1;
this.part2 = part2;
this.part3 = part3;
this.part4 = part4;
}
}
建造者模式2 product2类的 Builder()静态类植入值,静态方法.bulid();执行创建
应用场景:
需要生成的对象有复杂的内部结构 需要生成的对象内部属性本身相互依赖 与不可变对象配合使用
package main.java;
public class productModel2 {
public static void main(String[] args) {
product2 bulid = new product2.Builder().Productname("aa").part1("bb").bulid();
System.out.println(bulid);
}
}
class product2 {
private final String Productname;
private final String Productcompany;
private final String part1;
private final String part2;
private final String part3;
private final String part4;
static class Builder{
private String Productname;
private String Productcompany;
private String part1;
private String part2;
private String part3;
private String part4;
public Builder Productname(String productname) {
this.Productname = Productname;
return this;
}
public Builder part1(String part1) {
this.part1 = part1;
return this;
}
public Builder part2(String part2) {
this.part2 = part2;
return this;
}
public Builder part3(String part3) {
this.part3 = part3;
return this;
}
public Builder part4(String part4) {
this.part4 = part4;
return this;
}
product2 bulid(){
return new product2(this.Productname,this.Productcompany,this.part1,this.part2,this.part3,this.part4);
}
}
public product2(String productname, String productcompany, String part1, String part2, String part3, String part4) {
Productname = productname;
Productcompany = productcompany;
this.part1 = part1;
this.part2 = part2;
this.part3 = part3;
this.part4 = part4;
}
@Override
public String toString() {
return "product2{" +
"Productname='" + Productname + '\'' +
", Productcompany='" + Productcompany + '\'' +
", part1='" + part1 + '\'' +
", part2='" + part2 + '\'' +
", part3='" + part3 + '\'' +
", part4='" + part4 + '\'' +
'}';
}
}
原型模式(目的的将原型的对象复制一份,但是复制的对象和原来的对象是独立的,也就是引用的对象不同,在修改复制的对象时,原本的对象不会改变)
原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象(如果是mutable或者是基本数据类型,String类,只需要浅拷贝即可;如果是对象里有可变的对象,则该对象需要进行深拷贝) 浅拷贝:只是将指针引用的 深拷贝:复制一个对象
实现的方式由clone方法和序列化方法
clone是利用java的clone,将对象复制一份
序列化是将对象输出再输入,指针赋给当前的值实现深度拷贝
序列化方法
clone方法
product3 clone = (product3) super.clone();
BaseInfo clone1 = (BaseInfo) this.baseInfo.clone();
clone.setBaseInfo(clone1);
package main.java;
public class yxms {
public static void main(String[] args) throws CloneNotSupportedException {
BaseInfo gg = new BaseInfo("gg");
product3 product3 = new product3("a", "b", "c", "d", "e", "f",gg);
product3 clone = product3.clone();
clone.getBaseInfo().setCompanyname("aaaaaa");
clone.setPart1("bbbbbbbbbbbbbbbb");
System.out.println(product3);
System.out.println(clone);
}
}
class BaseInfo implements Cloneable{
private String companyname;
public BaseInfo(String companyname) {
this.companyname = companyname;
}
public String getCompanyname() {
return companyname;
}
public void setCompanyname(String companyname) {
this.companyname = companyname;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
@Override
public String toString() {
return super.hashCode()+"BaseInfo{" +
"companyname='" + companyname + '\'' +
'}';
}
}
class product3 implements Cloneable{
private String Productname;
private String Productcompany;
private String part1;
private String part2;
private String part3;
private String part4;
private BaseInfo baseInfo;
public BaseInfo getBaseInfo() {
return baseInfo;
}
public void setBaseInfo(BaseInfo baseInfo) {
this.baseInfo = baseInfo;
}
public String getProductname() {
return Productname;
}
public String getProductcompany() {
return Productcompany;
}
public String getPart1() {
return part1;
}
public String getPart2() {
return part2;
}
public String getPart3() {
return part3;
}
public String getPart4() {
return part4;
}
public product3() {
}
public void setProductname(String productname) {
Productname = productname;
}
public void setProductcompany(String productcompany) {
Productcompany = productcompany;
}
public void setPart1(String part1) {
this.part1 = part1;
}
public void setPart2(String part2) {
this.part2 = part2;
}
public void setPart3(String part3) {
this.part3 = part3;
}
public void setPart4(String part4) {
this.part4 = part4;
}
@Override
protected product3 clone() throws CloneNotSupportedException {
product3 clone = (product3) super.clone();
BaseInfo clone1 = (BaseInfo) this.baseInfo.clone();
clone.setBaseInfo(clone1);
return clone;
}
public product3(String productname, String productcompany, String part1, String part2, String part3, String part4,BaseInfo baseInfo) {
Productname = productname;
Productcompany = productcompany;
this.part1 = part1;
this.part2 = part2;
this.part3 = part3;
this.part4 = part4;
this.baseInfo = baseInfo;
}
@Override
public String toString() {
return super.hashCode()+"product3{" +
"Productname='" + Productname + '\'' +
", Productcompany='" + Productcompany + '\'' +
", part1='" + part1 + '\'' +
", part2='" + part2 + '\'' +
", part3='" + part3 + '\'' +
", part4='" + part4 + '\'' +
", baseInfo=" + baseInfo +
'}';
}
}
享元模式:实际中的String,池技术都用到,将多个功能的共同点整合到同一份代码实例(如果没有,就创建,如果由,就使用原来的)所有享元里面会有一个容器进行存储。 图说明:
flyweight:抽象的类,产品的抽象类,同时定义了抽象的公共方法*(内部状态)和个性化的方法(外部状态)接口或实现 concreatFlyweight:实现享元的方法 unsharedConcretaFlyweight :实现个性化的方法 flyweightfactory:享元工厂类,用于构建池容器(集合),同时提供从池中获取对象的方法
实现的说明: websiteFactory负责用于构建池容器(集合),同时提供从池中获取对象的方法 unsharedConcretaFlyweight = user concreatFlyweight = website
public class xyms {
public static void main(String[] args) {
websiteFactory websiteFactory = new websiteFactory();
website website = websiteFactory.getwebsitecatory("新闻");
website website2 = websiteFactory.getwebsitecatory("新闻2");
website.use(new user("nbb"));
website2.use(new user("nxx"));
System.out.println(websiteFactory.getpoolsize());
}
}
class user{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public user(String name) {
this.name = name;
}
@Override
public String toString() {
return "user{" +
"name='" + name + '\'' +
'}';
}
}
abstract class website{
abstract public void use(user a);
}
class Concreatwebsite extends website{
private String type="";
public Concreatwebsite(String type) {
this.type = type;
}
@Override
public void use(user a) {
System.out.println("Concreatwebsite"+type+a);
}
}
//厂类,根据需求,返回类
class websiteFactory{
private HashMap<String ,website> pool = new HashMap<>();
//根据网站类型返回一个网站,如果没有,就创建一个网站,放入到连接池中
public website getwebsitecatory(String type){
if(!pool.containsKey(type)){
pool.put(type,new Concreatwebsite(type));
}
return pool.get(type);
}
//获取池中有多少实例的类型
public int getpoolsize(){
return pool.size();
}
}
享元模式的integer实现
门面模式:减低客户端使用的复杂度,在实现某各功能时,需要用到class 1、 2、3,门面模式使用的facade管理下面的类,客户端只需要看facade而不需关注里面的实现类
优点,客户端不需要连接底层复杂的调用,减低开服复杂度
public class mmmshi {
public static void main(String[] args) {
facades facades = new facades();
facades.dosomething();
}
}
class facades{
subsystem1 subsystem = new subsystem1();
subsystem2 subsystemb = new subsystem2();
subsystem3 subsystemc = new subsystem3();
public void dosomething(){
subsystem.method1();
subsystemb.method1();
subsystemc.method1();
}
}
class subsystem1{
public void method1(){
System.out.println("method1");
}
}
class subsystem2{
public void method1(){
System.out.println("method2");
}
}
class subsystem3{
public void method1(){
System.out.println("method3");
}
}
适配器模式:(对现有的类的增强(聚合进适配器,实现对功能扩展))
对象是配置模式:实现方法,适配器adpter获取被适配的对象adaptee,处理完后,输出
使用场景:1、希望使用某些现有类,但其接口与其他代码不兼容时,使用适配器模式
2、当希望重用几个现有的子类,这些子类缺少一些不能添加到超类的公共功能时,可以使用该模式
对象适配器模式
public class adapter1 {
public static void main(String[] args) {
Target adapter = new Adapter(new adaptee());
int i = adapter.output5v();
System.out.println(i);
}
}
class adaptee{
public int output220(){
return 220;
}
}
interface Target{
int output5v();
}
class Adapter implements Target{
private adaptee aa;
public Adapter(adaptee aa) {
this.aa = aa;
}
@Override
public int output5v() {
int i = aa.output220();
//适配i
return i-100;
}
}
继承实现适配器模式(适配器继承了adapee,缺点时其他的方法都暴露)
装饰者模式:在不修改源对象的基础上,将功能附加在对象上
实现方法:
定义标准的抽象类component 原来已有的功能继承抽象类
decorator继承component,构造方法传入component类,同时处理需要增强 的功能 concreaderector是多次功能的选择
Component: 抽取被装饰者
decoretor :装饰类,包含被装饰的对象,因为装饰者和被装饰者都是继承同一个抽象类,所有对外部的代码不会产生影响,通过装饰器,可以修改被修饰者的属性值
优缺点: 无需修改现有对象,也无需创建对象的子类,即可扩展对象的功能。 可以多扩展功能进行动态添加或删除 可以扩展不同的装饰者来解决扩展不同功能的问题 缺点:多层装饰会比较复杂,无法控制装饰的顺序
装饰者模式和适配器模式的区别: 装饰者模式(Decorator Pattern)是指在不改变原有对象的基础之上,将功能附加到对 象上,提供了比继承更有弹性的替代方案(扩展原有对象的功能),属于结构型模式。 1、用于扩展一个类的功能或给一个类添加附加职责。 2、动态的给一个对象添加功能,这些功能可以再动态的撤销。
适配器模式(Adapter Pattern)是指将一个类的接口转换成客户期望的另一个接口,使 原本的接口不兼容的类可以一起工作,属于结构型设计模式。
package main.java.sjms;
public class decoreationtest1 {
public static void main(String[] args) {
Drink coffeB = new Chocolate(new Chocolate(new Milke(new CoffeB())));
System.out.println(coffeB.des());
System.out.println(coffeB.cost());
}
}
abstract class Drink{
private float price;
public String des;
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
public String getDes() {
return des;
}
public void setDes(String des) {
this.des = des;
}
public abstract float cost();
public abstract String des();
}
class Coffe extends Drink{
@Override
public float cost() {
return super.getPrice();
}
@Override
public String des() {
return super.getDes();
}
}
class CoffeB extends Coffe{
public CoffeB() {
setPrice(1.0f);
setDes("黑卡");
}
}
class CoffeC extends Coffe{
public CoffeC() {
setPrice(1.0f);
setDes("白卡");
}
}
class CoffeD extends Coffe{
public CoffeD() {
setPrice(1.0f);
setDes("aa卡");
}
}
class Decorator extends Drink{
private Drink obj;
public Decorator(Drink obj) {
this.obj = obj;
}
public float cost() {
return obj.cost()+super.getPrice();
}
@Override
public String des() {
return super.getDes()+"%%"+obj.des() ;
}
}
class Chocolate extends Decorator{
public Chocolate(Drink obj) {
super(obj);
setDes("巧克力");
setPrice(1.0f);
}
}
class Milke extends Decorator{
public Milke(Drink obj) {
super(obj);
setDes("Milke");
setPrice(1.0f);
}
}
class doujain extends Decorator{
public doujain(Drink obj) {
super(obj);
setDes("doujain");
setPrice(1.0f);
}
}
实现
桥接模式(两组类束,让其中一个组的类提供聚合到另外一组类,防止类的暴炸)
使用场景:适合两组类会由频繁的新增,相互之间有依赖关系
问题:如下图这种情况,因为每一种打开形式的收集下面都会对应者这些手机,添加新的功能,也要增加一系列的手机,这样的情况,会出现类爆炸
上面的图一换成图二的设计结构,使得手机的模型和品牌可以实现复用
它的实现是将不同的品牌聚合到不同模型的手机
代理模式:
静态代理(将类聚合到代理类中,代理类在执行聚合的类方法前后,对该方法进行前后的处理)
动态代理;(通过构造器将实现的类注入到代理的类,代理的类实现调用proxy。newProxyInstance,的代理方法实现对对象的代理)
动态代理的工厂,下面的方法时jdk自带的代理方法,将目标方法的传入,在创建工厂,实例对象传入工厂,调用工厂的方法,即可实现动态代理
cglib代(需要继承methidinterceptor类,并实现intercepter方法,在getproxyinstance对目标代理对象执行代理) final类不可被代理,目标方法是静态方法static也不会被代理
区别: jdk的代理实现时通过反射结合类加载器来实例化代理对象 cglib是通过asm来转换字节码生成新的类
(使用频繁) 模板方法模式(模板方法实现在抽象类,具体的使用,让继承的子类去实现) 可以避免重复代码的编写 在调用方法时,模板的方法,使用父类的,个性方法使用子类的
模板方法放入钩子方法, 模板里设计空方法,让子类实现,如果不实现就不执行
实现的原理:继承模板方法,需要实现的类由子类实现
空方法的目的是让子类对其覆盖
观察者模式(因为被观察者的动作而触发,被动触发) :subject依赖多个observer实例,weatherdata通过接口observer数据,注册所有的observce实现类
实现原理:被观察者聚合订阅者,被被观察者有 注册,删除,通知的功能(调用被注册的类方法)
实现:将观察者类聚合到被观察的类的数组中,如果被观察的类执行的更新的方法,就调用被聚合类的显示数据的方法,实现对数据变动的观察,同时被观察者还有移除注册类的功能
使用场景:发布订阅功能
策略模式:(直接触发策略的方法,主动触发) 策略通过聚合的方式传到主体(在dubbo的策略转换中会使用到)
实现方法:通过类的聚合,将需要执行的方法的类聚合到当前的类,并在当前的类中调用方法(也就是策略)
场景:(类的方法的自由切换方法)(切换的方法在其他的类中,通过聚合方式传入该对象,并在内部执行方法)
责任链模式: 使用场景:当对请求的处理,需要根据不同的情况,让不同的功能区执行时,可以通过这个责任链的模式设计程序
使用的方法
下面的Approver是以一个handler:1、有Approper属性,让下一个handler可以依赖 2、一个抽象方法,可以处理请求
实现的子类写具体的请求处理方法,如果处理不了,执行依赖的其他实现子类
在实际的调用中,根据顺序,依赖好各实现子类