デザインパターン(1)戦略パターン

  • デザインパターンの概要は、インターネット上の高品質の記事と、実際の作業で使用したシナリオの概要を組み合わせたものです。
  • 私たちが仕事で開発者としてよく使用するいくつかのデザインパターンを要約します。
  • 仕事上の都合により、ブログ投稿のまとめは仕事以外で記入しておりますので、よろしければ訂正させていただきますようお願い申し上げます。
  • デザインパターンに関するすべてのコードはホストされます:デザインパターンコード、注意を払うことを歓迎します。

なぜ日常の作業開発でデザインパターンを使用するのですか?JAVA開発者として、私が最初に考えるのは「すべてがオブジェクトである」ということです。同意しない場合は、何か新しいことを言いたいだけです。しかし、開発者間のコミュニケーションでは、問題をより正確に記述して解決できるようにするために、デザインパターンを考慮する必要があります。メリットは何ですか?もちろん、それはコードの再利用性、スケーラビリティを改善し、コードの冗長性を減らすことの問題です。これにより、同じ開発者がコードロジックをよりよく読んで理解できるようになります。

デザインパターンの6つの原則

  • オープンクローズ原則

開閉の原則は、拡張への開放と修正への閉鎖を意味します。プログラムを拡張する必要がある場合、ホットスワップ可能な効果を実現するために元のコードを変更することはできません。つまり、要約は次のとおりです。プログラムのスケーラビリティ、簡単なメンテナンスとアップグレード。

  • リスコフの置換原則

(Baidu百科事典より)Liskov Substitution Principleは、オブジェクト指向設計の基本原則の1つです。リヒター置換原則は、基本クラスが出現する可能性がある場合は常に、サブクラスが出現する必要があると述べています。LSPは、継承と再利用の基礎です。派生クラスが基本クラスを置き換えることができ、ソフトウェアユニットの機能に影響がない場合にのみ、基本クラスを再利用でき、派生クラスは基本クラスに新しい動作を追加することもできます。 。。リヒター置換原則は、「オープンクローズ」原則を補足するものです。「オープンクローズ」の原則を実現するための重要なステップは、抽象化です。基本クラスとサブクラスの間の継承関係は、抽象化の具体的な実現です。したがって、リヒター置換原則は、抽象化を実現するための具体的な手順の仕様です。

  • 依存性転換の原則

これが開閉原理の基本です。特定のコンテンツ:インターフェースプログラミングについては、具体的ではなく抽象化に依存します。(つまり、インターフェースまたは抽象クラスは実装クラスに依存せず、実装クラスはインターフェースまたは抽象クラスに依存します。より簡潔な定義は、オブジェクト指向設計(OOD)です)。

  • インターフェイス分離の原則

複数の分離されたインターフェースを使用することは、単一のインターフェースを使用するよりも優れています。これは、クラス間の結合の程度を減らすためのベンチマークでもあります。すべて「依存関係の削減と結合の削減」のサービスのためのものです。

  • デメテルの法則

(Baidu百科事典より)Dimitの法則は、Least Knowledge Principle(LKP)とも呼ばれます。エンティティは、システムの機能モジュールを比較的独立させるために、他のエンティティとの対話をできるだけ少なくする必要があります。つまり、クラスが他のクラスについて知っていることが少ないほど、オブジェクトは他のオブジェクトについてできるだけ知らないようにし、友人とのみ通信し、見知らぬ人とは話さないようにする必要があります。

  • 複合再利用原則(複合再利用原則)

複合再利用の原則は、継承ではなく、可能な限り構成/集約を使用することです(ソフトウェアを再利用する場合、実現するには、構成や集約などの関連付け関係を可能な限り使用してから、継承関係の使用を検討する必要があることを示します)達成するために)。

デザインパターンの分類

デザインパターンは一般的に3つのカテゴリに分類されます

  1. 作成モード:プロトタイプモード、シングルトンモード、ファクトリメソッドモード、抽象ファクトリモード、ビルダーモード。
  2. 構造モード:アダプタモード、装飾モード、エージェントモード、外観モード、ブリッジモード、組み合わせモード、フライウェイトモードの7種類があります。
  3. 動作モード:戦略モード、テンプレートメソッドモード、オブザーバーモード、反復サブモード、責任連鎖モード、コマンドモード、メモモード、ステータスモード、ビジターモード、中間モード、インタープリターモード、11。

戦略モードを始めましょう

戦略モード

  • 戦略モードとは何ですか?
  1. 実際、戦略モデルはアルゴリズムのパッケージ化であり、アルゴリズムの責任をアルゴリズム自体から分離し、さまざまなオブジェクト管理に委任し、最終的に複数のif判断の問題を解決します。たとえば、毎日旅行に出かけましょう。自転車に乗る、電車に乗る、高速列車に乗る、飛行機に乗るなど、さまざまな交通手段を選択できます。旅行にはさまざまな方法がありますが、あなたがすることはほぼ同じです-旅行すること。
  2. 上記のシナリオは、次のように説明することもできます。システムに多くのクラスがある場合、それらの違いは動作のみにあり、戦略モードを使用すると、オブジェクトに多くの動作の動作を動的に選択させることができます(つまり、上記複数のif判断の問題を解決すると述べた)。
  • 使用するシーン
  1. 多くの開発者は多かれ少なかれERPシステム開発にさらされてきたと思います。プロセス監査を実施するとき、彼らは最終的な監査結果を達成するためにさまざまなタイプを選択できます。たとえば、作業レポート、KPI / OKR、マイクロイノベーションなどのレビュープロセスがあります。
  2. Alipay、Xiaomi Pay、JD Pay、WeChat Payなどの大小のプラットフォームでの通常の総支払いについて話しましょう。現時点では、開発者として、非常に多くのプラットフォームをドッキングし、非常に多くのifを作成する必要があります。考えてみれば、それが不快であるか、戦略パターンを使用して問題を解決する場合。
public String audit(String type){
    
    
	if(type.equals("工作汇报")) {
    
    
		//TODO
		return "工作汇报流程审核处理";
	}
	if(type.equals("KPI/OKR")) {
    
    
		//TODO
		return "KPI/OKR流程审核处理";
	}
	if(type.equals("微创新")) {
    
    
		//TODO
		return "微创新流程审核处理";
	}
	return "未找到审核处理流程";
}

ネットワーク図からの戦略パターンの図:
ここに画像の説明を挿入

  • 戦略モード環境の構築次の
    名前のプロジェクトを作成します:springboot_design_pattern
  1. Maven環境の依存関係
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.1.RELEASE</version>
  </parent>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-autoconfigure</artifactId>
    </dependency>
	
	 <dependency>
      <groupId>commons-lang</groupId>
      <artifactId>commons-lang</artifactId>
	  <version>2.6</version>
    </dependency>

    <!--  配置文件显示-->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-configuration-processor</artifactId>
    </dependency>
  </dependencies>

  <build>
    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>2.3.1</version>
          <configuration>
            <source>1.8</source>
            <target>1.8</target>
            <encoding>utf-8</encoding>
          </configuration>
        </plugin>
        <plugin>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-maven-plugin</artifactId>
          <version>2.2.5.RELEASE</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>

抽象的な役割を定義する

package com.lee.strategy.service;

/**
 * @author zfl_a
 * @date 2020/8/10
 * @project springboot_design_pattern
 */
public abstract class AuditService {
    
    

    /**
     * 抽象,子类具体实现
     * @param name
     * @param msg
     * @return
     */
    public abstract boolean operation(String name,String msg);

    /**
     * 公用方法
     * @param typeName
     */
    protected void updateAuditInfo(String typeName){
    
    
        System.out.println("更新了"+typeName+"审核信息");
    }
}

具体的な実現-マイクロイノベーション実現クラス

package com.lee.strategy.service.impl;

import com.lee.strategy.service.AuditService;
import org.springframework.stereotype.Service;

/**
 * @author zfl_a
 * @date 2020/8/10
 * @project springboot_design_pattern
 */
@Service
public class InnovateAuditServiceImpl extends AuditService {
    
    
    @Override
    public boolean operation(String name, String msg) {
    
    

        //TODO
        System.out.println(name+"操作了微创新审核流程,留言内容:"+msg);

        //调用父类
        super.updateAuditInfo("微创新");
        return true;
    }
}

特定の実装-KPI / OKR実装クラス

package com.lee.strategy.service.impl;

import com.lee.strategy.service.AuditService;
import org.springframework.stereotype.Service;

/**
 * @author zfl_a
 * @date 2020/8/10
 * @project springboot_design_pattern
 */
@Service
public class KPIAuditServiceImpl extends AuditService {
    
    
    @Override
    public boolean operation(String name, String msg) {
    
    

        //TODO
        System.out.println(name+"操作了KPI/OKR审核流程,留言内容:"+msg);

        //调用父类
        super.updateAuditInfo("KPI/OKR");
        return true;
    }
}

特定の実装-作業レポートの実装クラス

package com.lee.strategy.service.impl;

import com.lee.strategy.service.AuditService;
import org.springframework.stereotype.Service;

/**
 * @author zfl_a
 * @date 2020/8/10
 * @project springboot_design_pattern
 */
@Service
public class WorkReportAuditServiceImpl extends AuditService {
    
    
    @Override
    public boolean operation(String name, String msg) {
    
    

        //TODO
        System.out.println(name+"操作了工作汇报审核流程,留言内容:"+msg);

        //调用父类
        super.updateAuditInfo("工作汇报");
        return true;
    }
}

列挙型クラスを定義して、3つの実装クラスに対応する情報をカプセル化します。これはコンテキストに相当します。(データベースに実装できます)

package com.lee.strategy.enumeration;

/**
 * @author zfl_a
 * @Desc 定义了枚举类实现,也可以定义在数据库中,根据类型取值
 * @date 2020/8/10
 * @project springboot_design_pattern
 */
public enum AuditEnum {
    
    

    INNOVATE_ADUIT("2","innovateAuditServiceImpl"),
    KPI_AUDIT("3","KPIAuditServiceImpl"),
    WORK_REPORT_AUDIT("4","workReportAuditServiceImpl");

    private String type;
    private String impl;

    private AuditEnum(String type,String impl){
    
    
        this.type = type;
        this.impl = impl;
    }

    public static String getImpl(String type){
    
    
        for(AuditEnum auditEnum : AuditEnum.values()) {
    
    
            if(type.equals(auditEnum.getType())) {
    
    
                return auditEnum.getImpl();
            }
        }
        return null ;
    }

    public String getType() {
    
    
        return type;
    }

    public void setType(String type) {
    
    
        this.type = type;
    }

    public String getImpl() {
    
    
        return impl;
    }

    public void setImpl(String impl) {
    
    
        this.impl = impl;
    }
}

特定のビジネスインターフェイスを定義する

package com.lee.strategy.service;

/**
 * @author zfl_a
 * @date 2020/8/10
 * @project springboot_design_pattern
 */
public interface StrategyService {
    
    

    boolean audit(String name,String msg,String type);
}

特定のビジネスインターフェイス実装クラスを定義する

package com.lee.strategy.service.impl;

import com.lee.strategy.enumeration.AuditEnum;
import com.lee.strategy.service.AuditService;
import com.lee.strategy.service.StrategyService;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Map;

/**
 * @author zfl_a
 * @date 2020/8/10
 * @project springboot_design_pattern
 */
@Service
public class StrategyServiceImpl implements StrategyService {
    
    

    //自动装配AuditService的所有实现类,以全类名首字母小写作为key
    @Autowired
    private Map<String, AuditService> auditMap ;

    @Override
    public boolean audit(String name, String msg, String type) {
    
    

        if(StringUtils.isBlank(type)) {
    
    
            return false ;
        }

        //根据不同类型审核
        String auditType = AuditEnum.getImpl(type);
        if(StringUtils.isNotBlank(auditType)) {
    
    
            AuditService auditService = auditMap.get(auditType);
            auditService.operation(name,msg);
        }

        return true;
    }
}

戦略コントローラーを定義する

package com.lee.strategy.controller;

import com.lee.strategy.service.StrategyService;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

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

/**
 * @author zfl_a
 * @date 2020/8/10
 * @project springboot_design_pattern
 */
@RestController
@RequestMapping("/strategy")
public class StrategyController {
    
    

    @Autowired
    private StrategyService strategyService ;

    /**
     * 审核流程 返回值不建议Map,可定义成响应结果对象封装
     * @param name 审核人
     * @param msg 留言内容
     * @param type 类型 2微创新 3KPI/OKR 4工作汇报,在实际工作当中根据实际业务
     * @return
     */
    @PostMapping("/audit")
    public Map<String,Object> audit(String name,String msg ,String type) {
    
    

        Map<String,Object> results = new HashMap<>();
        results.put("code","200");
        results.put("msg","审核成功");

        if(StringUtils.isBlank(type)) {
    
    
            results.put("code","-1");
            results.put("msg","请传递审核类型");
            return results ;
        }

        boolean audit = strategyService.audit(name, msg, type);
        if(!audit) {
    
    
            results.put("code","-2");
            results.put("msg","审核失败");
        }
        return results ;
    }
}

以下に示すように、にアクセスしてください。

ここに画像の説明を挿入

最終結果:

ここに画像の説明を挿入

デザインパターンに関するすべてのコードはホストされます:デザインパターンコード、注意を払うことを歓迎します。みんなで成長したい!

おすすめ

転載: blog.csdn.net/qq_37640410/article/details/108544835