文档章节

设计模式(Hibernate)

学而时习之
 学而时习之
发布于 2015/04/21 09:49
字数 1417
阅读 97
收藏 11
点赞 0
评论 0

1、概述

2、面向对象设计原则

    1)单一职责原则

    2)开闭原则

    3)里氏替换原则

    4)依赖倒置原则

    5)接口隔离原则

     6)迪米特原则

    7)组合/聚合复用原则

3、设计模式

4、设计模式分类

5、简单工厂模式

 样例:

产品接口类(Product):

package com.ljb.simplefactory;
/**
 * 产品接口
 * @author LJB
 * @version 2015年4月21日
 */
public interface Product {
 /**产品生产工艺*/
 public void craftwork();
 
 /**产品特征*/
 public void type();
}

 产品类(鲜奶):

 package com.ljb.simplefactory;
/**
 * 鲜奶
 * @author LJB
 * @version 2015年4月21日
 */
public class Creamery implements Product {
 @Override
 public void craftwork() {
  System.out.println("牛奶+除菌=鲜奶");
 }
 @Override
 public void type() {
  System.out.println("原味浓香");
 }
}

产品类(酸奶):

package com.ljb.simplefactory;
/**
 * 酸奶
 * @author LJB
 * @version 2015年4月21日
 */
public class Yoghourt implements Product {
 @Override
 public void craftwork() {
  System.out.println("牛奶+酵母菌+糖=酸奶");
 }
 @Override
 public void type() {
  System.out.println("酸甜可口");
 }
}

简单工厂类:

package com.ljb.simplefactory;
/**
 * 静态工厂
 * @author LJB
 * @version 2015年4月21日
 */
public class StaticFactory {
 public static Product factory (String str) throws BadException {
  if (str.equalsIgnoreCase("creamery")) {
   System.out.println("生产鲜奶");
   return new Creamery();
  } else if (str.equalsIgnoreCase("yoghourt")) {
   System.out.println("生产酸奶");
   return new Yoghourt();
  } else {
   throw new BadException("没有此产品");
  }
 }
}

异常类:

package com.ljb.simplefactory;
/**
 * 自定义异常类
 * @author LJB
 * @version 2015年4月21日
 */
public class BadException extends Exception {
 public BadException (String msg) {
  super(msg);
 }
}

测试类:

package com.ljb.simplefactory;
/**
 * 测试类
 * @author LJB
 * @version 2015年4月21日
 */
public class Test {
 /**
  * @param args
  */
 public static void main(String[] args) {
  try {
   Product x = StaticFactory.factory("creamery");
   x.craftwork();
   x.type();
   Product y = StaticFactory.factory("yoghourt");
   y.craftwork();
   y.type();
  } catch (BadException e) {
   e.printStackTrace();
  }
  
 }
}

执行结果:

生产鲜奶
牛奶+除菌=鲜奶
原味浓香
生产酸奶
牛奶+酵母菌+糖=酸奶
酸甜可口

小结:

工厂需要知道多有产品

缺点:对开闭原则支持不够

6、工厂方法模式

 注:引入简单工厂模式中的产品接口及产品类

增加:

工厂接口(ProductFactory):

package com.ljb.factorymethod;
/**
 * 工厂接口类
 * @author LJB
 * @version 2015年4月21日
 */
public interface ProductFactory {
 public Product factory();
}

工厂实现类(鲜奶工厂):

package com.ljb.factorymethod;
/**
 * 鲜奶工厂
 * @author LJB
 * @version 2015年4月21日
 */
public class CreameryFactory implements ProductFactory {
 @Override
 public Product factory() {
  System.out.println("生产鲜奶");
  return new Creamery();
 }
}

工厂实现类(酸奶工厂):

package com.ljb.factorymethod;
/**
 * 酸奶工厂类
 * @author LJB
 * @version 2015年4月21日
 */
public class YoghourtFactory implements ProductFactory {
 @Override
 public Product factory() {
  System.out.println("生产酸奶");
  return new Yoghourt();
 }
}

测试类:

package com.ljb.factorymethod;
/**
 * 测试类
 * @author LJB
 * @version 2015年4月21日
 */
public class Test {
 /**
  * @param args
  */
 public static void main(String[] args) {
  ProductFactory y = new CreameryFactory();
  y.factory().craftwork();
  y.factory().type();
  ProductFactory x = new YoghourtFactory();
  x.factory().craftwork();
  x.factory().type();
 }
}

7、代理模式

 样例:

抽象主题:

package com.ljb.proxy;
/**
 * 抽象主题或者是接口
 * @author LJB
 * @version 2015年4月21日
 */
public abstract class Subject {
 /**
  * 声明一个抽象的请求方法
  */
 abstract public void request();
}

真实主题:

package com.ljb.proxy;
/**
 * 真是主题
 * @author LJB
 * @version 2015年4月21日
 */
public class RealSubject extends Subject {
 @Override
 public void request() {
  System.out.println("实现请求");
 }
}

代理主题:

package com.ljb.proxy;
/**
 * 代理主题(通过代理实现对真实主题的引用,并且可以加入自己的方法)
 * @author LJB
 * @version 2015年4月21日
 */
public class ProxySubject extends Subject {
 private RealSubject realSubject;
 
 @Override
 public void request() {
  preRequest();
  if (realSubject == null) {
   realSubject = new RealSubject();
  }
  realSubject.request();
  aftRequest();
 }
 
 public void preRequest() {
  System.out.println("请求前的方法");
 }
 
 public void aftRequest () {
  System.out.println("请求后的方法");
 }
}

测试类:

package com.ljb.proxy;
/**
 * 测试类
 * @author LJB
 * @version 2015年4月21日
 */
public class Test {
 /**
  * @param args
  */
 public static void main(String[] args) {
  Subject proxy = new ProxySubject();
  proxy.request();
 }
}

运行结果:

请求前的方法
实现请求
请求后的方法

8、策略(strategy)模式

样例:

策略抽象类(抽象账户):

package com.ljb.strategy;
/**
 * 抽象账户
 * @author LJB
 * @version 2015年4月21日
 */
public abstract class Account {
 /**
  * 计算产品的真实价格
  * @param amount
  * @param price
  * @return
  */
 public abstract float getFactPrice (int amount , int price);
}

策略实现类(普通账户):

package com.ljb.strategy;
/**
 * 普通客户商品价格计算类
 * @author LJB
 * @version 2015年4月21日
 */
public class CommonAccount extends Account {
 @Override
 public float getFactPrice(int amount, int price) {
  return amount*price;
 }
}

策略实现类(会员账户):

package com.ljb.strategy;
/**
 * 会员商品价格计算类
 * @author LJB
 * @version 2015年4月21日
 */
public class InsiderAccount extends Account {
 @Override
 public float getFactPrice(int amount, int price) {
  // TODO Auto-generated method stub
  return amount*price*9/10;
 }
}

策略实现类(VIP账户):

package com.ljb.strategy;
/**
 * vip会员商品价格计算类
 * @author LJB
 * @version 2015年4月21日
 */
public class VipAccount extends Account {
 @Override
 public float getFactPrice(int amount, int price) {
  // TODO Auto-generated method stub
  return amount*price*8/10;
 }
}

策略维护类:

package com.ljb.strategy;
/**
 * 此类用于维护策略类的引用
 * 各个算法封装起来,通过维护类实现对各个算法的引用
 * @author LJB
 * @version 2015年4月21日
 */
public class Context {
 /**持有策略类的引用*/
 private Account account;
 
 /**
  * 构造方法,实例化策略类的引用
  * 父类作为方法形参的使用方式
  * @param account
  */
 public Context (Account account) {
  this.account = account;
 }
 
 /**
  * 调用策略方法
  * @param amount
  * @param price
  * @return
  */
 public float doAccount (int amount , int price) {
  return account.getFactPrice(amount, price);
 }
}

测试类:

package com.ljb.strategy;
/**
 * 测试类
 * @author LJB
 * @version 2015年4月21日
 */
public class Test {
 /**
  * @param args
  */
 public static void main(String[] args) {
  String name = "CD唱片";
  int amount = 2;
  int price = 50;
  float sum = 0;
  
  // 普通客户
  Context common = new Context(new CommonAccount());
  sum = common.doAccount(amount, price);
  System.out.println("您是普通客户没有折扣,商品名称:" + name +
   "数量:" + amount + "价格:" + price + "应付金额:" + sum);
  
  // 会员客户
  Context insider = new Context(new InsiderAccount());
  sum = insider.doAccount(amount, price);
  System.out.println("您是会员享受9折优惠,商品名称:" + name +
   "数量:" + amount + "价格:" + price + "应付金额:" + sum);
  
  // VIP客户
  Context vip = new Context(new VipAccount());
  sum = vip.doAccount(amount, price);
  System.out.println("您是VIP会员享受8折优惠,商品名称:" + name +
   "数量:" + amount + "价格:" + price + "应付金额:" + sum);
 }
}

运行结果:

您是普通客户没有折扣,商品名称:CD唱片数量:2价格:50应付金额:100.0
您是会员享受9折优惠,商品名称:CD唱片数量:2价格:50应付金额:90.0
您是VIP会员享受8折优惠,商品名称:CD唱片数量:2价格:50应付金额:80.0

 

 

© 著作权归作者所有

共有 人打赏支持
学而时习之
粉丝 29
博文 92
码字总数 42877
作品 0
西安
代理模式(Proxy Pattern):动态代理 - 最易懂的设计模式解析

前言 今天我来全面总结开发中最常用的设计模式 - 代理模式中的动态代理模式 其他设计模式介绍 1分钟全面了解“设计模式” 单例模式(Singleton) - 最易懂的设计模式解析 简单工厂模式(Sim...

Carson_Ho ⋅ 04/09 ⋅ 0

JavaScript设计模式之观察者模式

前言 准备研究一下MVVM的一些东西,由于MVVM运用了观察者模式的思想,因此翻开了《JavaScript设计模式与开发实践》一书,将观察者模式学习了一遍,顺便有对一些常用的设计模式进行一些了解,...

Srtian ⋅ 05/22 ⋅ 0

JavaScript 中常见设计模式整理

开发中,我们或多或少地接触了设计模式,但是很多时候不知道自己使用了哪种设计模式或者说该使用何种设计模式。本文意在梳理常见设计模式的特点,从而对它们有比较清晰的认知。 JavaScript 中...

牧云云 ⋅ 05/18 ⋅ 0

设计模式梳理(一)

设计模式梳理(一) 总体来说设计模式分为三大类: @案例源码地址:https://gitlab.com/lxqxsyu/DisgnPattern 创建型模式 简单工厂模式 工厂类是整个模式的关键。它包含必要的判断逻辑,能够...

lxq_xsyu ⋅ 2017/11/02 ⋅ 0

系统架构技能之设计模式-单件模式

一、开篇 其实我本来不是打算把系统架构中的一些设计模式单独抽出来讲解的,因为很多的好朋友也比较关注这方面的内容,所以我想通过我理解及平时项目中应用到的一 些常见的设计模式,拿出来给...

wbf961127 ⋅ 2017/11/12 ⋅ 0

Java经典设计模式-结构型模式-适配器模式(Adapter)

适配器模式 适配器模式主要分为三类:类的适配器模式、对象的适配器模式、接口的适配器模式。 适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的...

Idea ⋅ 01/20 ⋅ 0

设计模式.策略模式

策略模式跟抽象工厂非常相似,基本逻辑是根据需要实例化出需要用的类。不同的是策略模式需要调用者非常清晰的知道有哪些策略,各个策略的调用规则,而抽象工厂的话,需要知道有哪些类,找到调...

技术小胖子 ⋅ 2017/11/08 ⋅ 0

C#设计模式(2)——简单工厂模式

一、引言   这个系列也是自己对设计模式的一些学习笔记,希望对一些初学设计模式的人有所帮助的,在上一个专题中介绍了单例模式,在这个专题中继续为大家介绍一个比较容易理解的模式——简单工...

技术小胖子 ⋅ 2017/11/08 ⋅ 0

[设计模式]简单工厂模式

简介 简单工厂模式 (Simple Factory) 又叫静态工厂方法(Static Factory Method)模式。 简单工厂模式通常是定义一个工厂类,这个类可以根据不同变量返回不同类的产品实例。 简单工厂模式是一...

静默虚空 ⋅ 2015/06/03 ⋅ 0

设计模式Java Design Pattern-工厂方法模式FactoryMethod

我的博客 一、 设计模式的分类 大体可以分为三类: 创建型模式(5个) 单例模式、原型模式、工厂方法模式、抽象工厂模式、建造者模式 结构性模式(7个) 适配器模式、装饰器模式、代理模式、...

勇敢写信 ⋅ 03/22 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

【elasticsearch】 随笔 Date datatype

一。时间类型的本质 首先json是没有时间类型的,对于es来说,时间类型的标示可以是下面三种情况 1.一个时间格式的字符串,如:"2014-11-27T08:05:32Z","2015-01-01" or "2015/01/01 12:10:3...

xiaomin0322 ⋅ 21分钟前 ⋅ 0

阿里云资源编排ROS使用教程

阿里云资源编排ROS详细内容: 阿里云资源编排ROS使用教程 资源编排(Resource Orchestration)是一种简单易用的云计算资源管理和自动化运维服务。用户通过模板描述多个云计算资源的依赖关系、...

mcy0425 ⋅ 24分钟前 ⋅ 0

适配器设计模式

1、适配器模式 把一个类的接口变换成客户端所期待的另一种接口 使原本因接口不匹配而无法在一起工作的两个类能够在一起工作 分为类的适配器模式和对象的适配器模式 2、类适配器模式 类的适配...

职业搬砖20年 ⋅ 28分钟前 ⋅ 0

npm操作报错 _stream_writable.js:61

有一天 不知道什么原因(估计和node的版本有关),无论你做什么npm的操作 都会报错/usr/local/lib/node_modules/npm/node_modules/readable-stream/lib/_stream_writable.js:61 这时候只要执...

lilugirl ⋅ 32分钟前 ⋅ 0

Eclipse安装插件的几种方式

Eclipse魅力之一就是支持可扩展的插件,来丰富自身的功能,这种方式也是建立在开源思想之上的。具体使用什么方式去安装插件,要看我们拿到的是什么。 1. 拿到的是一串URL,如http://subclips...

GordonNemo ⋅ 34分钟前 ⋅ 0

div图片叠加

css实现代码如下: <div style="position: relative;"><!--这个层为外面的父层,需设置相对位置样式--> <div style="position: absolute;"><!--子层,需设置绝对位置样式--> <i......

niithub ⋅ 36分钟前 ⋅ 0

作用域slot

如果父组件需要使用子组件中的内容怎么办,比如父组件需要控制子组件的显示 <div id="root"><child><template slot-scope="props"><h1>{{props.item}} <div>编辑</div></h1><......

金于虎 ⋅ 38分钟前 ⋅ 1

HongHu commonservice-eureka 项目构建过程

上一篇我们回顾了关于 spring cloud eureka的相关基础知识,现在我们针对于HongHu cloud的eureka项目做以下构建,整个构建的过程很简单,我会将每一步都构建过程记录下来,希望可以帮助到大家...

明理萝 ⋅ 41分钟前 ⋅ 1

xml和对象的相互转化

@Data//setter和getter方法,toString和equals,hashcode方法@EqualsAndHashCode//代表重写equals和hashcode方法@XmlAccessorType(XmlAccessType.FIELD)public class Classroom {@X......

拐美人 ⋅ 41分钟前 ⋅ 0

tableView cell的高度 分组头部尾部的高度 自适应

@property (nonatomic) CGFloat rowHeight; // default is UITableViewAutomaticDimension@property (nonatomic) CGFloat sectionHeaderHeight; // default is UITableViewA......

娜一片蓝色星海 ⋅ 42分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部