zoukankan      html  css  js  c++  java
  • 设计模式

    ####简单工厂(不属于设计模式)

    简单工厂又称为静态工厂,因为其中的方法都是静态的。

    简单工厂是用来创建对象实例的,包括接口,抽象类,具体类的对象实例。

    package simplefactory.example1;
    
    public interface Api {
        public void operation(String s);
    }
    package simplefactory.example1;
    
    public class ImplA implements Api {
        @Override
        public void operation(String s) {
          System.out.println("ImplA s ="+s);
        }
    }
    package simplefactory.example1;
    
    public class ImplB implements Api {
        @Override
        public void operation(String s) {
             System.out.println("ImplB s ="+s);
        }
    }
    package simplefactory.example1;
    
    public class Factory {
        private Factory() {}
        public static Api createApi(int condition){
            Api api = null;
            if (condition == 1) {
                api = new ImplA();
            } else if(condition == 2) {
                api = new ImplB();
            }
            return api;
        }
    }
    package simplefactory.example1;
    
    /**
     * 参数的选择来自客户端
     * @author Administrator
     *
     */
    public class Client {
        public static void main(String[] args) {
            Api api = Factory.createApi(1);
             api.operation("mfs");
        }
    }

    (一)####外观模式

    package facade.example2;
    
    public class Presentation {
         public void generate(){
             ConfigModel cm = ConfigManager.getInstance().getConfigData();
             if(cm.isNeedGenPresentation()){
                 System.out.println("正在生成表现层代码");
             }
         }
    }
    package facade.example2;
    
    public class Business {
       public void generate(){
           ConfigModel cm = ConfigManager.getInstance().getConfigData();
           if(cm.isNeedGenBusiness()){
               System.out.println("正在生成业务层代码");
           }
       }
    }
    package facade.example2;
    
    public class Dao {
         public void generate(){
             ConfigModel cm = ConfigManager.getInstance().getConfigData();
             if(cm.isNeedGenDao()){
                 System.out.println("正在生成数据层代码");
             }
         }
    }
    package facade.example2;
    
    public class ConfigManager {
        private ConfigManager(){}
        private static ConfigManager manager = null;
        private static ConfigModel cm = null;
        
        public static ConfigManager getInstance(){
            if(manager == null){
                manager = new ConfigManager();
                cm = new ConfigModel();
            }
            return manager;
        }
        
        public ConfigModel getConfigData(){
            return cm;
        }
        
    }
    package facade.example2;
    
    public class ConfigModel {
        // 是否需要生成表现层
        private boolean needGenPresentation = true;
        // 是否需要生成逻辑层
        private boolean needGenBusiness = true;
        // 是否需要生成Dao层
        private boolean needGenDao = true;
    
        public boolean isNeedGenPresentation() {
            return needGenPresentation;
        }
    
        public void setNeedGenPresentation(boolean needGenPresentation) {
            this.needGenPresentation = needGenPresentation;
        }
    
        public boolean isNeedGenBusiness() {
            return needGenBusiness;
        }
    
        public void setNeedGenBusiness(boolean needGenBusiness) {
            this.needGenBusiness = needGenBusiness;
        }
    
        public boolean isNeedGenDao() {
            return needGenDao;
        }
    
        public void setNeedGenDao(boolean needGenDao) {
            this.needGenDao = needGenDao;
        }
    
    }
    package facade.example2;
    
    public class Client {
    
        /**
           * 客户端使用起来非常方便
         * @param args
         */
        public static void main(String[] args) {
             new Facade().generate();
        }
    }

    (二)####适配器模式

    package adapter.example1;
    
    /**
     * 已经存在的接口
     * @author Administrator
     *
     */
    public class Adaptee {
        
        public void specificRequest(){
            System.out.println("适配器方法");
        }
        
    }
    package adapter.example1;
    
    /**
     * 客户端希望调用的接口
     * @author Administrator
     *
     */
    public interface Target {
        
        public void request();
        
    }
    package adapter.example1;
    
    /**
     * 适配器
     * @author Administrator
     *
     */
    public class Adapter implements Target {
    
       //被适配的对象
       private Adaptee adaptee;
        
       //通过构造方法传入
       public Adapter(Adaptee  adaptee){
            this.adaptee = adaptee;
        }
       
        @Override
        public void request() {
            // TODO Auto-generated method stub
            adaptee.specificRequest();
        }
    
    }
    package adapter.example1;
    
    public class Client {
    
        
        public static void main(String[] args) {
            
            Adapter adapter = new Adapter(new Adaptee());
            adapter.request();
            
        }
    }

    (三)####单例模式

    public class Singleton {
    
        private static Singleton instance = new Singleton();
    
        private Singleton() {
            
        }
    
        public static Singleton getInstance() {
            return instance;
        }
    
    }

     最简单的实现单例的例子 ,采用单元素枚举

    public enum Singleton {
        // 一个元素就代表这个类的一个实例
        uniqueIntance ;
        public void singletonOperate(){
            
        }
        public static void main(String[] args) {
            for(int i=0;i<3;i++){
                System.out.println(Singleton.uniqueIntance.hashCode());
            }
        }
    
    }

    利用缓存实现一个类只有三个实例

    public class OneExtend {
    
        //做为key的前缀
        private static final String DEFAULT_KEY = "Cache";
        
        private OneExtend() {}
        
        private  static Map<String ,OneExtend > map = new HashMap<String ,OneExtend>();
        //当前正在使用的第几个实例
        private static int num = 1;
        //最大的数量
        private static final int NUM_MAX = 3;
        
        public  synchronized static OneExtend getInstance(){
            String key = DEFAULT_KEY+num;
            OneExtend object = map.get(key);
            if(object == null){
                object = new OneExtend();
                map.put(key, object);
            }
            num++;
            if(num > NUM_MAX){
                num =1;
            }
            return object;
        }
    
    }

    (四)####职责链模式

    /**
     * 
     * @author Administrator
      *       职责对象的接口
     */
    public abstract class Handler {
        
        protected Handler successor = null;
        
        public void setSuccessor(Handler successor ) {
            this.successor = successor;
        }
        
        public abstract String handleFeeRequest(String user , int fee);
    
    }
    public class ProjectManager  extends Handler {
    
        
        @Override
        public String handleFeeRequest(String user, int fee) {
            String str = "";
            if(fee < 500) {
                if("小李".equals(user)) {
                    str =  "项目经理同意"+user + "的聚餐费用"+fee + "元的申请";
                }else {
                    str =  "项目经理不同意"+user + "的聚餐费用"+fee + "元的申请";
                }
            }else { // 超过500 , 传递给级别高的人处理
                if(successor != null) {
                     str =  successor.handleFeeRequest(user, fee);
                }
            }
            return str;
        }
    
    }
    public class DepManager extends Handler {
    
        @Override
        public String handleFeeRequest(String user, int fee) {
            String str = "";
            if(fee < 1000) {
                if("小李".equals(user)) {
                    str =  "部门经理同意"+user + "的聚餐费用"+fee + "元的申请";
                }else {
                    str =  "部门经理不同意"+user + "的聚餐费用"+fee + "元的申请";
                }
            }else { // 超过1000, 传递给级别高的人处理
                if(successor != null) {
                     str =  successor.handleFeeRequest(user, fee);
                }
            }
            return str;
        }
    
    }
    public class GeneralManager extends Handler {
    
        @Override
        public String handleFeeRequest(String user, int fee) {
            String str = "";
            if(fee >= 1000) {
                if("小李".equals(user)) {
                    str =  "总经理同意"+user + "的聚餐费用"+fee + "元的申请";
                }else {
                    str =  "总经理不同意"+user + "的聚餐费用"+fee + "元的申请";
                }
            }else { //  传递给级别高的人处理
                if(successor != null) {
                     str =  successor.handleFeeRequest(user, fee);
                }
            }
            return str;
        }
    
    }
    public class Client {
    
        public static void main(String[] args) {
            
            Handler h1 = new ProjectManager();
            Handler h2 = new DepManager();
            Handler h3 = new GeneralManager();
            
            h1.setSuccessor(h2);
            h2.setSuccessor(h3);
            
            String res = h1.handleFeeRequest("小李", 1800);
            System.out.println(res);
        }
    }

    (五)####装饰者模式

    //组件接口
    public abstract class Component {
    
        //计算某人在某段时间的奖金,为了简化,begin和end不使用
        public abstract   double calcPrice(String user , Date begin , Date end);
    }
    //被装饰器装饰的对象
    public class ConcreteComponent  extends Component{
    
        
        @Override
        public double calcPrice(String user, Date begin, Date end) {
            //默认没有奖金
            return 0;
        }
        
    
    }
    public abstract class Decorator extends Component {
    
        private Component component;
    
        public Decorator(Component component) {
            this.component = component;
        }
    
        @Override
        public double calcPrice(String user, Date begin, Date end) {
            
            return component.calcPrice(user, begin, end);
        }
        
    }
    //计算当月奖金
    public class MonthPrizeDecorator extends Decorator {
    
        public MonthPrizeDecorator(Component component) {
            super(component);
        }
    
        
        @Override
        public double calcPrice(String user, Date begin, Date end) {
            //前面计算的奖金
            double money =  super.calcPrice(user, begin, end);
            //取出当月奖金
            double prize = TempDB.mapMonthSaleMoney.get(user) * 0.03;
            
            System.out.println(user + "当月业务奖金" + prize);
            
            return money + prize;
            
        }
    
    }
    public class SumPrizeDecorator extends Decorator {
    
        public SumPrizeDecorator(Component component) {
            super(component);
        }
    
        @Override
        public double calcPrice(String user, Date begin, Date end) {
            //前面计算的奖金
            double money =  super.calcPrice(user, begin, end);
            //累计业务额奖金
            double prize =10000.0 * 0.01;
            System.out.println(user + "累计业务奖金" + prize);
            
            return money + prize;
        }
        
    }
    public class GroupPrizeDecorator  extends Decorator{
    
        public GroupPrizeDecorator(Component component) {
            super(component);
        }
    
        @Override
        public double calcPrice(String user, Date begin, Date end) {
            //前面计算的奖金
            double money =  super.calcPrice(user, begin, end);
            
            double group = 0;
            for(double d : TempDB.mapMonthSaleMoney.values()) {
                group += d;
            }
            
            double prize = group * 0.01;
            
            System.out.println(user + "当月团队奖金" + prize);
            
            return money + prize;
        }
        
    }
    public class TempDB {
    
        private TempDB() {}
        
        //记录每个人的月度销售额
        public static Map<String , Double> mapMonthSaleMoney = new HashMap<>();
        
        static {
            mapMonthSaleMoney.put("张三", 10000.0);
            mapMonthSaleMoney.put("李四", 20000.0);
            mapMonthSaleMoney.put("王五", 30000.0);
        }
        
    }
    public class Client {
    
        public static void main(String[] args) {
            //被装饰的对象
            Component c1 = new ConcreteComponent();
            
            //组合装饰者,装饰者没有先后顺序
            Decorator d1 = new MonthPrizeDecorator(c1);
            Decorator d2 = new SumPrizeDecorator(d1);
            
            double  zs = d2.calcPrice("张三", null, null);
            System.out.println("张三应得奖金  :"+zs);
            
            System.out.println();
            
            //如果是经理
            Decorator d3 = new GroupPrizeDecorator(d2);
            double ls = d3.calcPrice("李四", null, null);
            System.out.println("经理李四应得奖金  :"+ls);
        }
    }

    (六)####桥接模式

    //实现部分的接口
    public interface  MessageImplementor {
        
        
        public void send(String message, String toUser);
        
    
    }
    //Email 实现
    public class MessageEmail  implements MessageImplementor{
    
        @Override
        public void send(String message, String toUser) {
            System.out.println("使用Email的方式发送  , "+ message + ",给" + toUser);
            
        }
    
    }
    //SMS实现
    public class MessageSMS implements MessageImplementor  {
    
        @Override
        public void send(String message, String toUser) {
            System.out.println("使用站内SMS的方式发送  , "+ message + ",给" + toUser);
        }
    
    }
    //抽象部分的接口
    public abstract class AbstractMessage  {
    
        protected MessageImplementor implementor;
        
        
        public AbstractMessage(MessageImplementor implementor) {
            this.implementor = implementor;
        }
        
        
        public void sendMessage(String message ,String toUser) {
            implementor.send(message, toUser);
        }
        
    }
    //抽象部分的实现--普通消息
    public class CommonMessage  extends AbstractMessage {
    
        public CommonMessage(MessageImplementor implementor) {
            super(implementor);
        }
    
        
        @Override
        public void sendMessage(String message, String toUser) {
            // TODO Auto-generated method stub
            super.sendMessage(message, toUser);
        }
        
        
        
    }
    //抽象部分的实现---加急消息
    public class UrgencyMessage  extends AbstractMessage {
    
        public UrgencyMessage(MessageImplementor implementor) {
            super(implementor);
        }
    
        @Override
        public void sendMessage(String message, String toUser) {
            message = "【加急】"+message;
            super.sendMessage(message, toUser);
        }
    
        
        
    }
    public class Client {
        
        public static void main(String[] args) {
            
            //具体的实现
            MessageImplementor impl = new MessageSMS();
            
            //创建普通消息
            AbstractMessage a = new CommonMessage(impl);
            a.sendMessage("请喝一杯茶", "小李");
                    
            //创建一个加急消息
            a = new UrgencyMessage(impl);
            a.sendMessage("请喝一杯茶", "小李");
            
        }
    
    }
  • 相关阅读:
    numpy—————数组操作
    ML———聚类算法之K-Means
    DataFrame————数据离散化处理(元素定位与离散化处理)
    windows 搭建和配置 hadoop + 踩过的坑
    Pandas -----简述 Series和DataFrame
    numpy 函数和用法总结、示例
    分词————jieba分词(Python)
    (31)本地yum仓库的安装配置
    (30)zookeeper的数据结构
    (29)zookeeper的命令行客户端
  • 原文地址:https://www.cnblogs.com/moris5013/p/10519707.html
Copyright © 2011-2022 走看看