设计模式

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

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

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

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("请喝一杯茶", "小李");
        
    }

}

 

posted @ 2019-03-12 21:14  踏月而来  阅读(222)  评论(0编辑  收藏  举报