首页 > 其他分享 >prefer 组合 to 继承

prefer 组合 to 继承

时间:2024-03-23 10:33:32浏览次数:26  
标签:String 组合 继承 commitMessage Builder prefer private owner public

核心不要多继承,要通过组合的模式进行组合,解耦, 非强绑定

需求

我已有一个CodingService的接口,同时有一个CodingServiceImpl的实现类,接口中定义了createReository,pullCode,pushCode三个方法,CodingServiceImpl 实现类里面进行了实现,现在想通过prefer 组合 to 继承的思想,将接口中的3个方法抽取出来变成单独的功能模块,方法依赖的参数变成独立功能模块里的属性,然后通过Builder构造者模式把方法参数传递进功能模块的属性里。功能模块执行没有任何参数的do方法。请帮我设计一下,并给出实践案例

实际代码

为了遵循组合优于继承的原则,并且利用构建者模式来构造对象,我们可以将CodingService接口中的方法createRepository, pullCode, pushCode分别抽象成三个独立的功能模块。每个功能模块都会有一个内部的Builder类用于构建该模块的实例,这些模块将会有一个无参的do方法来执行相应的操作。

以下是根据上述描述设计的代码实现:

首先定义一个基础的接口CodingOperation,所有的操作类都要实现这个接口:

public interface CodingOperation {
    void doOperation();
}

然后为每个操作定义一个模块,每个模块都包含一个Builder类:
创建Repository模块

public class RepositoryCreationModule implements CodingOperation {
    private String repositoryName;
    private String owner;

    private RepositoryCreationModule(Builder builder) {
        this.repositoryName = builder.repositoryName;
        this.owner = builder.owner;
    }

    @Override
    public void doOperation() {
        // 实现创建仓库的逻辑
        System.out.println("Creating repository " + repositoryName + " for owner " + owner);
    }

    public static class Builder {
        private String repositoryName;
        private String owner;

        public Builder repositoryName(String repositoryName) {
            this.repositoryName = repositoryName;
            return this;
        }

        public Builder owner(String owner) {
            this.owner = owner;
            return this;
        }

        public RepositoryCreationModule build() {
            return new RepositoryCreationModule(this);
        }
    }
}

创建代码模块

public class CodePullModule implements CodingOperation {
    private String sourceBranch;
    private String destinationBranch;

    private CodePullModule(Builder builder) {
        this.sourceBranch = builder.sourceBranch;
        this.destinationBranch = builder.destinationBranch;
    }

    @Override
    public void doOperation() {
        // 实现拉取代码的逻辑
        System.out.println("Pulling code from " + sourceBranch + " to " + destinationBranch);
    }

    public static class Builder {
        private String sourceBranch;
        private String destinationBranch;

        public Builder sourceBranch(String sourceBranch) {
            this.sourceBranch = sourceBranch;
            return this;
        }

        public Builder destinationBranch(String destinationBranch) {
            this.destinationBranch = destinationBranch;
            return this;
        }

        public CodePullModule build() {
            return new CodePullModule(this);
        }
    }
}

推送代码模块

public class CodePushModule implements CodingOperation {
    private String branchName;
    private String commitMessage;

    private CodePushModule(Builder builder) {
        this.branchName = builder.branchName;
        this.commitMessage = builder.commitMessage;
    }

    @Override
    public void doOperation() {
        // 实现推送代码的逻辑
        System.out.println("Pushing code to branch " + branchName + " with message '" + commitMessage + "'");
    }

    public static class Builder {
        private String branchName;
        private String commitMessage;

        public Builder branchName(String branchName) {
            this.branchName = branchName;
            return this;
        }

        public Builder commitMessage(String commitMessage) {
            this.commitMessage = commitMessage;
            return this;
        }

        public CodePushModule build() {
            return new CodePushModule(this);
        }
    }
}

现在进行测试

public class CodingServiceClient {
    public static void main(String[] args) {
        RepositoryCreationModule repositoryCreation = new RepositoryCreationModule.Builder()
                .repositoryName("MyRepo")
                .owner("Myself")
                .build();
        repositoryCreation.doOperation();

        CodePullModule codePull = new CodePullModule.Builder()
                .sourceBranch("develop")
                .destinationBranch("feature")
                .build();
        codePull.doOperation();

        CodePushModule codePush = new CodePushModule.Builder()
                .branchName("feature")
                .commitMessage("Added new feature")
                .build();
        codePush.doOperation();
    }
}

好处:
这样的设计允许我们将每个操作封装在自己的模块中,同时通过构建者模式提供了一种清晰的方式来构造这些模块。每个模块都是独立的,它们可以被独立地创建和复用,也便于单独测试和维护

标签:String,组合,继承,commitMessage,Builder,prefer,private,owner,public
From: https://www.cnblogs.com/PythonOrg/p/18090855

相关文章

  • MATLAB用GARCH-EVT-Copula模型VaR预测分析股票投资组合
    全文链接:http://tecdat.cn/?p=30426原文出处:拓端数据部落公众号对VaR计算方法的改进,以更好的度量开放式基金的风险。本文把基金所持股票看成是一个投资组合,引入Copula来描述多只股票间的非线性相关性,构建多元GARCH-EVT-Copula模型来度量开放式基金的风险,并与其他VaR估计方法的预......
  • 【代码随想录】零钱兑换II(关于组合与排列的区别)
    题目描述分析按动态规划的分析步骤分析的话,代码是不难写出来的,但是写出来后你就会发现,结果不对,多出了很多组合:解决方法:什么都不用改,直接把两个循环调换即可。。代码如下:#include<bits/stdc++.h>usingnamespacestd;intchange(intamount,vector<int>&coins){ i......
  • C++看程序写结果:类继承与类组合,默认与含参的构造先后顺序 易错
    C++类继承与类组合,默认与含参的构造先后顺序 易错这道题原本是没有那么多输出信息的,是我自己加上了调用什么函数的提示。一开始以为就输出两行,一行是构造父类时A:5,一行是构造子类时x=5,A::x=5。#include"bits/stdc++.h"usingnamespacestd;classA{public:A(){......
  • python中的多继承理解
    在python的多继承中,父类的初始化顺序遵循所谓方法解析顺序(MethodResolutionOrder,MRO)的机制。python使用C3线性化算法来确定多继承类的MRO:1.目标:创建一个一致的线性继承顺序,同时保持父类的相对顺序和子类优先原则。2.子类优先:子类总是在其父类之前出现。从而子类......
  • C#_继承_多态_抽象类_虚方法_密封类_静态类
    文章目录前言类的继承继承类的构造函数子类访问父类访问修饰符测试多态_函数重载多态_运算符重载可重载与不可重载的运算符抽象类虚方法new和override密封类和静态类结构体上期习题答案本期习题前言C#是面向对象的编程语言,面向对象编程的四项基本原则:抽象:将......
  • PHP+MySQL开发组合:智慧同城便民信息小程序源码系统 带完整的安装代码包以及安装部署教
    当前,城市生活的节奏日益加快,人们对各类便民信息的需求也愈发迫切。无论是寻找家政服务、二手交易,还是发布租房、求职信息,一个高效、便捷的信息平台显得尤为重要。传统的信息发布方式往往存在信息更新不及时、查找困难等问题,无法满足现代都市人的需求。罗峰给大家分享一款智慧同......
  • (44/60)完全背包、零钱兑换Ⅱ、组合总和Ⅳ
    day44完全背包卡码网:携带研究材料(第七期模拟笔试)动态规划思路完全背包,物品可以无限次取,正序遍历。复杂度分析时间复杂度:O(N^2)。空间复杂度:O(N)。代码实现#include<iostream>#include<algorithm>#include<vector>usingnamespacestd;/*给j的容量可重复选择的最......
  • Copula估计边缘分布模拟收益率计算投资组合风险价值VaR与期望损失ES|附代码数据
    全文链接:http://tecdat.cn/?p=24753最近我们被客户要求撰写关于风险价值的研究报告,包括一些图形和统计输出。在这项工作中,我通过创建一个包含四只基金的模型来探索copula,这些基金跟踪股票、债券、美元和商品的市场指数摘要然后,我使用该模型生成模拟值,并使用实际收益和模拟收......
  • 39. 组合总和c
    /***Returnanarrayofarraysofsize*returnSize.*Thesizesofthearraysarereturnedas*returnColumnSizesarray.*Note:Bothreturnedarrayand*columnSizesarraymustbemalloced,assumecallercallsfree().*/inttemp[50];voiddfs(int*c......
  • 40. 组合总和 IIc
    /***Returnanarrayofarraysofsize*returnSize.*Thesizesofthearraysarereturnedas*returnColumnSizesarray.*Note:Bothreturnedarrayand*columnSizesarraymustbemalloced,assumecallercallsfree().*/inttemp[150];intcmp(const......