葡京网上娱乐场设计模式 – 策略模式

前言:

  先任模式, 把他以及外的名字都遗忘了, 来瞧问题 和 设计思路.
为甚要这样做. 

遇是问题。按照网上大家介绍的法去化解,但是一直挺。后来发现自己的阿里云服务器安全组规则中从不加加端口号也3306之宗,加上之后,问题即解决。

场景:

  有同样小庄, 里面有一个店员, 售货员当然是一旦出卖东西的呐,
客户上买完东西, 找售货员结账, 那售货员得亮一共多少钱吧?

一. 初步设计

  商品类:

package org.elvin.strategy;

/***/
public class Goods {
    /**
     * 商品名
     */
    private String name;

    /**
     * 商品价格
     */
    private Long Price;

    public Goods() { }

    public Goods(String name, Long price) {
        this.name = name;
        Price = price;
    }

    //region getter / setter
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Long getPrice() {
        return Price;
    }

    public void setPrice(Long price) {
        Price = price;
    }
    //endregion
}

 

由于价位我下的凡 Long 类型, 所以, 要有一个转移输出的方法.

package org.elvin.strategy;

import java.text.MessageFormat;

public class MoneyUtils {
    public static String getYuan(Long money){
        Long yuan = money / 100;
        Long jiao = money % 100 /  10;
        Long fen = money % 10;

        return MessageFormat.format("{0}.{1}{2}", yuan, jiao , fen );
    }
}

售货员:

package org.elvin.strategy;

import org.elvin.strategy.calculator.*;
import org.junit.Test;

import java.util.ArrayList;
import java.util.List;

/**
 * 环境角色(Context)*/
public class Seller {

    /**
     * 姓名
     */
    private String name;

    /**
     * 编号
     */
    private String code;

    //region getter / setter
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }
    //endregion

    /**
     * 售卖商品
     */
    public void sellGoods(List<Goods> goods){
        Long sum = 0L;
        for (Goods good : goods) {
            sum += good.getPrice();
        }
        System.out.println("应付款: " + MoneyUtils.getYuan(sum) + " 元");
    }

    @Test
    public void func1(){
        List<Goods> goods = new ArrayList<>();
        goods.add(new Goods("泡面", 550L));
        goods.add(new Goods("泡面", 550L));
        goods.add(new Goods("泡面", 550L));
        goods.add(new Goods("火腿", 150L));
        goods.add(new Goods("火腿", 150L));
        goods.add(new Goods("火腿", 150L));
        goods.add(new Goods("鸡蛋", 70L));
        goods.add(new Goods("鸡蛋", 70L));
        goods.add(new Goods("鸡蛋", 70L));
        goods.add(new Goods("饼干", 250L));
        goods.add(new Goods("辣条", 300L));

        sellGoods(goods);
    }
}

来拘禁一下计量结果:

葡京网上娱乐场 1

抱结果了, 没啥毛病, 挺好. 

今日老板了生日, 突然想到, 要无苟还店里行个运动, 来只优惠活动,
有些商品减价销售. 

明老板了生日, 老板娘说, 老娘高兴, 你减价销售, 明天我来单免单销售.

那么本咋办吧? 明天过后, 价格定又要过来到正常价格.  what the fuck! 

Seller类写好了, 难道我以里面加几单计算办法? 

加以进去貌似可以缓解就题材, 但是, 后天如果业主的娘家人过生日也? 咋弄?

 

Ok, 到这里, 差不多, 需要请有今天之死去活来神 : 策略模式.
让他来帮衬我们缓解者题材吧.

 

二. 设计改造

对售货员来说, 她得懂得, 今天欠怎么算价格, 是特惠还是不优惠,
或者是满载小钱, 送东西啊的. 

那, 将这些优惠或者说价格的计量方式抽象出, 成为一个接口或者抽象类. 

吃优惠或者未优惠实现或者连续他.

实现方式:

此间, 我将他抽象为一个接口

package org.elvin.strategy.calculator;

import org.elvin.strategy.Goods;

import java.util.List;

/**
 * 抽象策略角色(Strategy)
 * 优惠接口
*/
public interface PreferentialPrice {
    public void getPrice(List<Goods> goods);
}

PreferentialPrice 需要作为一个属性,出现在 Seller 类中.

在Seller中加入

    /**
     * 计算优惠后的价格
     * 抽象角色, 次角色给出所有具体策略类所需的接口
     */
    private PreferentialPrice preferentialPrice;

    public PreferentialPrice getPreferentialPrice() {
        return preferentialPrice;
    }

    public void setPreferentialPrice(PreferentialPrice preferentialPrice) {
        this.preferentialPrice = preferentialPrice;
    }

 

此地提供三种植计算办法:

  1. 例行艺术

    /**

    • 切实策略角色(ConcreteStrategy)
      */
      public class NoPreferential implements PreferentialPrice {

      @Override
      public void getPrice(List goods) {

       Long sum = 0L;
       for (Goods good : goods) {
           sum += good.getPrice();
       }
       System.out.println("应付款: " + MoneyUtils.getYuan(sum) + " 元");
      

      }
      }

  2. 免单方式

    /**

    • 实际策略角色(ConcreteStrategy)
      */
      public class Free implements PreferentialPrice {
      @Override
      public void getPrice(List goods) {

       System.out.println("免单, 不要钱 !");
      

      }
      }

  3. 一部分优惠方式

    /**

    • 切切实实策略角色(ConcreteStrategy)
      */
      public class ReduceSomeGoods implements PreferentialPrice {

      @Override
      public void getPrice(List goods) {

       Long sum = 0L;
       for (Goods good : goods) {
           switch (good.getName()) {
               case "泡面":
                   sum += good.getPrice() - 50L;
                   break;
      
               case "火腿":
                   sum += good.getPrice() - 20L;
                   break;
      
               case "鸡蛋":
                   sum += good.getPrice() - 10L;
                   break;
      
               default:
                   sum += good.getPrice();
                   break;
           }
       }
       System.out.println("应付款: " + MoneyUtils.getYuan(sum) + " 元");
      

      }
      }

  

 将Seller类中, 计算的法门修改一下:

    public void sellGoods(List<Goods> goods){
        if(preferentialPrice == null){
            setPreferentialPrice(new NoPreferential());
        }
        preferentialPrice.getPrice(goods);
    }

以测算的当儿, 如果没有传来优惠, 则默认使用无优惠措施

复拘留测试方法:

    @Test
    public void func1(){
        List<Goods> goods = new ArrayList<>();
        goods.add(new Goods("泡面", 550L));
        goods.add(new Goods("泡面", 550L));
        goods.add(new Goods("泡面", 550L));
        goods.add(new Goods("火腿", 150L));
        goods.add(new Goods("火腿", 150L));
        goods.add(new Goods("火腿", 150L));
        goods.add(new Goods("鸡蛋", 70L));
        goods.add(new Goods("鸡蛋", 70L));
        goods.add(new Goods("鸡蛋", 70L));
        goods.add(new Goods("饼干", 250L));
        goods.add(new Goods("辣条", 300L));

        setPreferentialPrice(new Free());
        sellGoods(goods);
        System.out.println("-----------------------");
        setPreferentialPrice(new ReduceSomeGoods());
        sellGoods(goods);
        System.out.println("-----------------------");
        setPreferentialPrice(new NoPreferential());
        sellGoods(goods);
    }

结果:

  葡京网上娱乐场 2

政策模式作为同样种对象行为模式, 在这里当要体现到了吧.

这就是说总结一下?给个未轻了解(网上抄的):

  策略模式属于对象的行为模式。其用意是对准一组算法,将诸一个算法封装到独具协同接口的独自的近乎吃,从而令它可以互相替换。策略模式让算法可以当匪影响及客户端的图景下发生变化。

说的较空虚, 来个有血有肉的吧:

  一美妙哥哥喜欢约妹子, 那咋约出来呢? 不是具的胞妹都喜欢用看录像吧.
那针对不同之阿妹, 使用不同之主意来约. 约好看录像之妹妹看电影,
约喜欢吃小吃的妹妹吃小吃.

那用, 看电影, 吹海风…… 等等, 这些招数,
目的还是为让妹妹做他女对象(这里不讨论时). 目的不移, 手段层出不穷.
这些措施, 就足以理解啊不同之 strategy. 

 

通过者的事例, 可以看来, 具体的算法和算法之间无借助关系,
都是无异于之(平等性), 可以互相替换的. 那在运作的时节,
每次都不得不采取相同种植(唯一性). 

题目:mysql不管是故不安装版的,还是用直接设置之,还是用phpStudy直接披露之mysql服务。都只能用localhost登录,不可知就此服务器的ip进行长途访问

临时分享解决措施总结如下:

 

3、如果是出口服务器。。一定要是丰富安全组
  云控制台–>网络与平安–>安全组–>配置规则–>添加3306合乎方向及发方向

2、没有授予相应的权能:
  mysql>GRANT ALL PRIVILEGES ON *.* TO ‘myuser’@’%’ IDENTIFIED BY
‘mypassword’ WITH GRANT OPTION;
  例如:GRANT ALL PRIVILEGES ON *.* TO ‘high’@’%’ IDENTIFIED BY
‘111111’ WITH GRANT OPTION;

面前少栽办法选择一个不怕足以了。

1、 修改mysql数据库被的user表使相应的用户会自某平等主机上陆 
  mysql -u root –p
  mysql>use mysql;
  mysql>update user set host = ‘%’ where user = ‘root’;
  mysql>select host, user from user;