zoukankan      html  css  js  c++  java
  • 建造者模式加策略模式计算个人工资

    定义

    建造这模式 又名生成器模式,是一种对象构建模式。它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象

    建造者模式 是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。

    建造者模式优点

    • 客户端不必知道产品内部组成的细节,将产品本身与产品的创建过程解耦,使得相同的创建过程可以创建不同的产品对象。
    • 每一个具体建造者都相对独立,而与其他的具体建造者无关,因此可以很方便地替换具体建造者或增加新的具体建造者, 用户使用不同的具体建造者即可得到不同的产品对象 。
    • 可以更加精细地控制产品的创建过程 。将复杂产品的创建步骤分解在不同的方法中,使得创建过程更加清晰,也更方便使用程序来控制创建过程。
    • 增加新的具体建造者无须修改原有类库的代码,指挥者类针对抽象建造者类编程,系统扩展方便,符合 “开闭原则”

    建造者模式的缺点

    • 增加新的具体建造者无须修改原有类库的代码,指挥者类针对抽象建造者类编程,系统扩展方便,符合 “开闭原则”
    • 产品内部变化很复杂的情况: 如果产品的内部变化复杂,可能会导致需要定义很多具体建造者类来实现这种变化,导致系统变得很庞大。
            // 我们要建造一个人的信息,包括基本信息,岗位信息,部门信息, 考勤信息。
            // 要求我们算出这个人的每月工资
            // 工资基本构成
            // 岗位等级 1=>1000,2=>2000,3=>3000
            // 出勤一天100
            // 请假一天扣100
            // 请算出小明,年龄=>20,性别=>男,住址=>河北省,岗位=>前端开发,等级=>2,
            // 部门=>网络部,出勤=>25天,请假=>5天,扣款=>300
            class People {
                // 基本信息
                basic({name, age, gender, address}) {
                    this.name = name; // 姓名
                    this.age = age;  // 年龄
                    this.gender = gender; // 性别
                    this.address = address; // 住址
                }
                // 岗位信息
                jobsInfo({jobs, level}) {
                    this.jobs = jobs; // 岗位
                    this.level = level; // 等级
                }
                // 部门信息
                departmentInfo({department}) {
                    this.department = department; // 部门
                }
                // 考勤信息
                attendanceInfo({attendanceDays, leaveDays}) {
                    this.attendanceDays = attendanceDays; // 出勤天数
                    this.leaveDays = leaveDays // 请假天数
                }
                // 工资信息
                wageInfo({deductions}) {
                    this.deductions = deductions; // 扣款
                }
            }
            let _basic = {
                    name:'小明',
                    age:'20',
                    gender:'男',
                    address:'河北省'
                },
                _jobsInfo = {
                    jobs:'前端开发',
                    level:2
                },
                _departmentInfo = {
                    department:'网络部'
                },
                _attendanceInfo = {
                    attendanceDays:25,
                    leaveDays:5
                },
                _wageInfo = {
                    deductions:300
                }
            class Builders extends People{
                constructor(strategy) {
                    super();
                    this.basic(_basic);
                    this.jobsInfo(_jobsInfo);
                    this.departmentInfo(_departmentInfo);
                    this.attendanceInfo(_attendanceInfo);
                    this.wageInfo(_wageInfo);
                    this.wageMoney =  strategy;
                }
                init(){
                    return this.wageMoney.realWages();
                }
            }
            class Strategy extends Builders{
                constructor({jobsMoney, attendancMoney, leaveMoney, deductionsMoney}){
                    super();
                    this.wage = 0;
                    this._jobsMoney = jobsMoney;
                    this._attendancMoney = attendancMoney;
                    this._leaveMoney = leaveMoney;
                    this._deductionsMoney = deductionsMoney;
                }
                realWages(){
                    this.jobsWage(this._jobsMoney)
                    this.attendancWage(this._attendancMoney,this._leaveMoney);
                    this.deductionsWage(this._deductionsMoney);
                    return `姓名:${this.name},年龄:${this.age},住址:${this.address},岗位:${this.jobs},等级:${this.level},部门:${this.department},出勤:${this.attendanceDays},请假:${this.leaveDays},扣款:${this.deductions},工资${this.wage}`;
                }
                jobsWage(jobsMoney){
                    // 等级工资
                    this.wage += this.level * jobsMoney;
                    console.log(this.wage,'等级')
                }
                attendancWage(attendancMoney,leaveMoney){
                    // 全勤工资
                    this.wage += this.attendanceDays * attendancMoney;
                    this.wage = this.wage - this.leaveDays * leaveMoney;
                    console.log(this.wage,'出勤')
                }
                deductionsWage(deductionsMoney){
    
                    this.wage = this.wage - deductionsMoney;
                    console.log(this.wage,'扣款')
                }
            }
            let peopleInfo = new Builders(new Strategy({jobsMoney:1000,attendancMoney:100,leaveMoney:100,deductionsMoney:300}));
            console.log(peopleInfo.init()) // 姓名:小明,年龄:20,住址:河北省,岗位:前端开发,等级:2,部门:网络部,出勤:25,请假:5,扣款:300,工资3700
    
  • 相关阅读:
    树的直径 学习笔记
    SDOJ 3742 黑白图
    【SDOJ 3741】 【poj2528】 Mayor's posters
    SDOJ 3740 Graph
    SDOJ 3696 Tree
    SDOJ 1195 Zhenhuan
    又一次受刺激后的发奋
    html_表单form中的input类型大集合
    js_表格的增删改
    JS_拖拽窗口的实现
  • 原文地址:https://www.cnblogs.com/mengxiangji/p/11070826.html
Copyright © 2011-2022 走看看