【设计模式08】桥接器

前言

适用于同业务域下多个维度,每个维度多个方法的情况。比如点咖啡业务域,咖啡有容量和风味两个维度,容量分为大中小,风味有拿铁,卡布奇诺。普通写法会写大杯拿铁,大杯卡布奇诺,。。。,总共要写n x m个类,类爆炸了

桥接器将两个维度解耦,通过关联来桥接,类的数量可以将为n+m个

UML类图

【设计模式08】桥接器_第1张图片

代码示例

取数场景,
维度一:对象类型,用户维度、订单维度、稿件维度
维度二:指标类型,访问量,点击率

package com.sw.learn.pattern.C_structre.b_bridge.consts;

public enum ObjectType {
    USER,
    ORDER,
    CONTENT;
}



package com.sw.learn.pattern.C_structre.b_bridge.consts;

public enum MetricType {
    VISIT_COUNT, CLICK_RATE
}



package com.sw.learn.pattern.C_structre.b_bridge.dim;

import com.sw.learn.pattern.C_structre.b_bridge.consts.ObjectType;
import com.sw.learn.pattern.C_structre.b_bridge.consts.MetricType;
import com.sw.learn.pattern.C_structre.b_bridge.metric.IMetric;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 维度基本不变,作为抽象类,关联数据指标
 */
public abstract class AbsDim {

    protected final Map<MetricType, IMetric> metricMap = new HashMap<>();

    /**
     * 桥接过程
     *
     * @param metrics
     */
    @Autowired
    AbsDim(List<IMetric> metrics) {
        for (IMetric metric : metrics) {
            metricMap.put(metric.getType(), metric);
        }
    }

    public abstract ObjectType getType();

    public void fetchData(MetricType metricType) {
        IMetric metric = metricMap.get(metricType);
        switch (getType()) {
            case USER:
                metric.collectUserData();
                break;
            case ORDER:
                metric.collectOrderData();
                break;
            case CONTENT:
                metric.collectContentData();
                break;
            default:
                throw new IllegalArgumentException("Unsupported dimension: " + getType());
        }
    }
}



package com.sw.learn.pattern.C_structre.b_bridge.dim;

import com.sw.learn.pattern.C_structre.b_bridge.consts.ObjectType;
import com.sw.learn.pattern.C_structre.b_bridge.metric.IMetric;
import org.springframework.stereotype.Component;

import java.util.List;

@Component
public class ContentDim extends AbsDim {
    ContentDim(List<IMetric> metrics) {
        super(metrics);
    }

    @Override
    public ObjectType getType() {
        return ObjectType.CONTENT;
    }
}



package com.sw.learn.pattern.C_structre.b_bridge.dim;

import com.sw.learn.pattern.C_structre.b_bridge.consts.ObjectType;
import com.sw.learn.pattern.C_structre.b_bridge.metric.IMetric;
import org.springframework.stereotype.Component;

import java.util.List;

@Component
public class OrderDim extends AbsDim {
    OrderDim(List<IMetric> metrics) {
        super(metrics);
    }

    @Override
    public ObjectType getType() {
        return ObjectType.ORDER;
    }
}



package com.sw.learn.pattern.C_structre.b_bridge.dim;

import com.sw.learn.pattern.C_structre.b_bridge.consts.ObjectType;
import com.sw.learn.pattern.C_structre.b_bridge.metric.IMetric;
import org.springframework.stereotype.Component;

import java.util.List;

@Component
public class UserDim extends AbsDim {
    UserDim(List<IMetric> metrics) {
        super(metrics);
    }

    @Override
    public ObjectType getType() {
        return ObjectType.USER;
    }
}



package com.sw.learn.pattern.C_structre.b_bridge.metric;

import com.sw.learn.pattern.C_structre.b_bridge.consts.MetricType;

/**
 * 指标变化大,作为接口
 */
public interface IMetric {
    MetricType getType();

    void collectUserData();     // 处理用户维度
    void collectOrderData();    // 处理订单维度
    void collectContentData();  // 处理内容维度
}



package com.sw.learn.pattern.C_structre.b_bridge.metric;

import com.sw.learn.pattern.C_structre.b_bridge.consts.MetricType;
import org.springframework.stereotype.Component;

@Component
public class ClickRateMetric implements IMetric {
    @Override
    public MetricType getType() {
        return MetricType.CLICK_RATE;
    }

    @Override
    public void collectUserData() {
        // 实现用户数据收集逻辑
        System.out.println("收集用户点击率数据");
    }

    @Override
    public void collectOrderData() {
        // 实现订单数据收集逻辑
        System.out.println("收集订单点击率数据");
    }

    @Override
    public void collectContentData() {
        // 实现内容数据收集逻辑
        System.out.println("收集内容点击率数据");
    }
}



package com.sw.learn.pattern.C_structre.b_bridge.metric;

import com.sw.learn.pattern.C_structre.b_bridge.consts.MetricType;
import org.springframework.stereotype.Component;

@Component
public class VisitCountMetric implements IMetric {
    @Override
    public MetricType getType() {
        return MetricType.VISIT_COUNT;
    }

    @Override
    public void collectUserData() {
        // 实现用户数据收集逻辑
        System.out.println("收集用户访问量数据");
    }

    @Override
    public void collectOrderData() {
        // 实现订单数据收集逻辑
        System.out.println("收集订单访问量数据");
    }

    @Override
    public void collectContentData() {
        // 实现内容数据收集逻辑
        System.out.println("收集内容访问量数据");
    }
}

你可能感兴趣的:(设计模式,设计模式,java,开发语言)