java 中设计模式
1. 单例模式(一个类只有一个实例)
package ch.test.notes.designmodel; /**
* Description: 单例模式 (饿汉模式 线程安全的)
*
* @author cy
* @date 2019年05月10日 9:33
* version 1.0
*/
public class Singelon { private static Singelon si = new Singelon(); public static Singelon getInstance() {
return si;
} private Singelon() { // 将构造方法封装为私有化
} public void print(){
System.out.println("打印--------->");
}
}
package ch.test.notes.designmodel; /**
* Description: 单例模式 (懒汉模式)线程不安全
*
* @author cy
* @date 2019年05月10日 9:33
* version 1.0
*/
public class Singelon { private static Singelon si = null; private Singelon() { // 将构造方法封装为私有化
} public static Singelon getInstance() {
if(si == null){
si = new Singelon();
}
return si;
} public void print(){
System.out.println("打印--------->");
}
}
2. 工厂模式(多个子类实现一个接口,根据不同子类复写父类方法,根据业务产生不同的实例)
package ch.test.notes.designmodel; /**
* Description:定义一个人的接口
*
* @author cy
* @date 2019年05月10日 9:50
* version 1.0
*/
public interface Person1 { // 人的身高
String getHeight(); // 职位
String getWork(); }
创建两个实现类
package ch.test.notes.designmodel; /**
* Description: 实现类
*
* @author cy
* @date 2019年05月10日 9:52
* version 1.0
*/
public class Student implements Person1 { @Override
public String getHeight() {
return "";
} @Override
public String getWork() {
return "我的职位是学生!";
}
}
package ch.test.notes.designmodel; /**
* Description:实现类
*
* @author cy
* @date 2019年05月10日 9:53
* version 1.0
*/
public class Tearch implements Person1 { @Override
public String getHeight() {
return "";
} @Override
public String getWork() {
return "我的职位是教师!";
}
}
创建一个工厂,根据类型不同创建不同的对象
package ch.test.notes.designmodel; /**
* Description: 人员工厂
*
* @author cy
* @date 2019年05月10日 9:55
* version 1.0
*/
public class Factory { public static Person1 getInstance(String type){
Person1 person = null;
if("".equals(type)){
person = new Student();
}else {
person = new Tearch();
}
return person;
}
}
测试(传入不同的类型,得到不同的对象内容)
package ch.test.notes.designmodel; /**
* Description: // 设计模式
*
* @author cy
* @date 2019年05月10日 9:16
* version 1.0
*/
public class main { public static void main(String[] args) {
Person1 instance = Factory.getInstance("");
String work = instance.getWork();
System.out.println(work); } }
3. 代理模式 (由一个主题来操作一个真实主题,代理服务器来完成一个真实业务以外的业务)
角色(要做的东西, 假设只有vip 能做, 代理就是vip 普通人员不是,所以需要代理人代理)
package ch.test.notes.designmodel; /**
* Description: 商店
*
* @author cy
* @date 2019年05月10日 10:32
* version 1.0
*/
public interface Store { // 买东西
String getGoods(boolean vip); }
package ch.test.notes.designmodel; /**
* Description:
*
* @author cy
* @date 2019年05月10日 10:35
* version 1.0
*/
public class StoreImpl implements Store { private int num = ; @Override
public String getGoods(boolean vip) {
if(!vip){
System.out.println("只有VIP才能购买商品!");
return "只有VIP才能购买商品!";
}
num --;
System.out.println("购买了货物,剩余数量为"+ num);
return "购买了货物,剩余数量为"+ num;
}
}
package ch.test.notes.designmodel; /**
* Description: 代理
*
* @author cy
* @date 2019年05月10日 10:34
* version 1.0
*/
public class Proxy{ private Store store;
private Boolean vip = true; public Proxy(Store store){
this.store = store;
} // 购买商品
public String getGoods() {
// 这里也可以做一些校验
// 检查身份证
return store.getGoods(this.vip);
}
}
package ch.test.notes.designmodel; /**
* Description: // 设计模式
*
* @author cy
* @date 2019年05月10日 9:16
* version 1.0
*/
public class main { public static void main(String[] args) {
StoreImpl store = new StoreImpl();
store.getGoods(false);
new Proxy(store).getGoods();
} }
结果:
只有VIP才能购买商品!
购买了货物,剩余数量为9
4. 委派模式(相当于领导给项目经理下达任务,项目经理将不同的任务,下达到不同的人上面,和上面的区别是注重的是结果,不需要过程)
(角色 做任务 员工A 员工B 组长 组长接到任务后,分配给A和B)
package ch.test.notes.designmodel; /**
* Description: 老板需要做的任务
*
* @author cy
* @date 2019年05月10日 11:08
* version 1.0
*/
public interface ITarget { public void doSomething(String command);
}
package ch.test.notes.designmodel; /**
* Description:
*
* @author cy
* @date 2019年05月10日 11:10
* version 1.0
*/
public class TargetA implements ITarget{ @Override
public void doSomething(String command) {
System.out.println("我是员工A,开始做"+command+"工作");
}
}
package ch.test.notes.designmodel; /**
* Description:
*
* @author cy
* @date 2019年05月10日 11:10
* version 1.0
*/
public class TargetB implements ITarget{ @Override
public void doSomething(String command) {
System.out.println("我是员工B,开始做"+command+"工作");
}
}
package ch.test.notes.designmodel; import java.util.HashMap;
import java.util.Map; /**
* Description: 组长
*
* @author cy
* @date 2019年05月10日 11:11
* version 1.0
*/
public class Leader implements ITarget { private Map<String,ITarget> map = new HashMap<>(); public Leader(){
map.put("打扫",new TargetA());
map.put("吃饭",new TargetB());
} @Override
public void doSomething(String command) {
map.get(command).doSomething(command);
} public static void main(String[] args) {
new Leader().doSomething("吃饭");
new Leader().doSomething("打扫");
}
}
5. 策略模式
背景:在软件开发过程中,要实现一种功能,需要多种算法或者策略,我们可以根据应用场景不同,选择不同算法和策略和实现该功能。比如一系列算法,把每个算法封装
起来,并且使他们可以相互替换,这就是策略模式。
假如我们有一个鸭子的抽象类,包含行为所有的鸭子都会游泳,属性鸭子的信息,如果我们增加一个飞行的功能,但是有些鸭子没有飞行的能力,所以我们不能再抽象类
中加入飞行的方法。这时候,就需要我们抽象一个飞的接口。
1.首先抽象一个策略接口
package ch.test.notes.designmodel; /**
* Description:策略接口
*
* @author cy
* @date 2019年05月10日 12:37
* version 1.0
*/
public interface CarFunction { void run(); //每辆车有不同的行驶方法
}
2.具体策略父类
package ch.test.notes.designmodel; /**
* Description:每个车都具有的相同的属性和行为
*
* @author cy
* @date 2019年05月10日 12:38
* version 1.0
*/
public class Car implements CarFunction { protected String name; //车名字
protected String color; //车颜色 public Car(String name, String color) {
this.name = name;
this.color = color;
} @Override
public void run() {
System.out.println(color +" " + name +"在行驶。。。");
}
}
具体策略实现子类
package ch.test.notes.designmodel; /**
* Description:
*
* @author cy
* @date 2019年05月10日 13:09
* version 1.0
*/
public class SmallCar extends Car {
public SmallCar(String name, String color) {
super(name, color);
} @Override
public void run() {
System.out.println(color +" " + name +"在高速的行驶。。。");
}
}
package ch.test.notes.designmodel; /**
* Description:
*
* @author cy
* @date 2019年05月10日 13:11
* version 1.0
*/
public class BussCar extends Car { public BussCar(String name, String color) {
super(name, color);
} @Override
public void run() {
System.out.println(color +" " + name +"在缓慢的行驶。。。");
} }
应用场景
package com.design.strategy;
/**
*
* @ClassName : Person
* @Description : 应用场景类
*
*/
public class Person {
private String name; //姓名
private Integer age; //年龄
private Car car; //拥有车 public void driver(Car car){
System.out.print(name +" "+ age+" 岁 "+" 开着");
car.run();
} public Person(String name,Integer age) {
this.name=name;
this.age=age;
} }
运行环境
package com.design.strategy;
/**
*
* @ClassName : Strategy
* @Description : 运行环境类:Strategy
* @date : 2017年12月9日 上午11:43:58
*
*/
public class Strategy {
public static void main(String[] args) {
Car smallCar = new SmallCar("路虎","黑色");
Car bussCar = new BussCar("公交车","白色");
Person p1 = new Person("小明", );
p1.driver(smallCar);
p1.driver(bussCar);
}
} 运行结果:
小明 岁 开着黑色 路虎在高速的行驶。。。
小明 岁 开着白色 公交车在缓慢的行驶。。。
6.原型模式
就是对对象的拷贝,深拷贝、浅拷贝生成新的对象。
7.适配器模式 (由源到目标的适配)
目标
public interface Robot
{
public void cry();
public void move();
}
源
public class Dog
{
public void shout()
{
System.out.println("狗可以汪汪叫!");
}
public void run()
{
System.out.println("狗可以跑!");
}
}
进行适配
public class DogAdapter extends Dog implements Robot
{
public void cry(){
System.out.print("机器人模仿:");
super.shout();
}
public void move(){
System.out.print("机器人模仿:");
super.run();
}
}
如果想要实现一个接口,但是又不想实现所有的接口,我们可以抽象出来一个方法,然后再去继承这个类,进行方法的复写,这也是适配模式
java 中设计模式的更多相关文章
- java中设计模式详解
一.设计模式的分类 总体来说设计模式分为三大类: (1)创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. (2)结构型模式,共七种:适配器模式.装饰器模式.代理模式.外 ...
- Java中设计模式之工厂模式-4
一.工厂模式由来 1)还没有工厂时代:假如还没有工业革命,如果一个客户要一款宝马车,一般的做法是客户去创建一款宝马车,然后拿来用. 2)简单工厂模式:后来出现工业革命.用户不用去创建宝马车.因为客户有 ...
- Java中设计模式之生产者消费者模式-4
引言 生产者-消费者(producer-consumer)问题,也称作有界缓冲区(bounded-buffer)问题,两个进程共享一个公共的固定大小的缓冲区.其中一个是生产者,用于将消息放入缓冲区:另 ...
- Java中设计模式之装饰者模式-3
装饰者模式: 动态地将责任附加到对象上.若要扩展功能,装饰者提供了比继承更加有弹性的替代方案. 装饰者核心:实现功能组合 继承与组合区别: 继承 继承是给一个类添加行为的比较有效的途径.通过使用继承, ...
- Java中设计模式之单例设计模式-1
单例作用 1 节省内存 2 可以避免多种状态导致状态冲突 单例的创建步骤 1 私有化构造方法 2 私有化声明的属性 3 getInstance 4 方法需要静态 单例分类 1.懒汉式 2.饿汉式 两种 ...
- java中的23中设计模式(转)
设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
- Java中的GOF23(23中设计模式)--------- 单例模式(Singleton)
Java中的GOF23(23中设计模式)--------- 单例模式(Singleton) 在Java这这门语言里面,它的优点在于它本身的可移植性上面,而要做到可移植的话,本身就需要一个中介作为翻译工 ...
- java开发中的23中设计模式详解--大话设计模式
设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
- java中的23中设计模式(转载的,有时间一定要熟读)
设计模式(Design Patterns) --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...
随机推荐
- python如何实现相对导入
如果python中导入的package或module不在环境变量PATH中,可以使用sys.path将要导入的package或module加入到PATH环境变量中,之后便能使用相对导入方法. 拿hom ...
- python序列化之pickle,json,shelve
模块 支持方法 说明 json dumps/dump loads/load 只能处理基本数据类型: 用于多种语言间的数据传输: pickle dumps/dump loads/load 支持pytho ...
- Swift 数组,字典,结构体,枚举
1.数组 let types = ["none","warning","error"]//省略类型的数组声明 var menbers = [ ...
- MYSQL5.7版本解决sql_mode=only_full_group_by问题
在安装有些二开框架时会遇到下面的问题,在填写完数据库密码之后他会提示你请在mysql配置文件中修改ql-mode去掉ONLY_FULL_GROUP_BY,但是我们去mysql的配置文件中查找此配置,有 ...
- hdoj5289【RMQ+二分】【未完待续】
思路: 对当前值查找最近满足位置: 利用RMQ求出区间最大最小值,再枚举右端点,二分区间找到满足要求的最大区间累加
- 計蒜客/小教官(xjb)
題目鏈接:https://nanti.jisuanke.com/t/366 題意:中文題誒~ 思路: 先通過給出的條件構造一個符合題意的數組(可以是任意一個符合條件的數組,菜雞不會證明: 然後構造的數 ...
- 如何在普通 UIViewController 中使用 UITableView
本系列文章 <Swift on iOS 学习笔记> 将以不定长度.不定内容.不定形式的方式对外发布,主要记录一些 “可重用” 的知识,感谢你的阅读. 在继承自 UIViewControll ...
- JAVA 7新特性——在单个catch代码块中捕获多个异常,以及用升级版的类型检查重新抛出异常
在Java 7中,catch代码块得到了升级,用以在单个catch块中处理多个异常.如果你要捕获多个异常并且它们包含相似的代码,使用这一特性将会减少代码重复度.下面用一个例子来理解. Java 7之前 ...
- iOS蓝牙架构搭建-2
蓝牙架构的搭建 前言:笔者认为,如果只是单纯的传授大家代码怎么敲,那么大家很有可能在实际开发中难以运用.刚好本人曾经参与过多款智能硬件开发的架构搭建,本小节本人就现场带领大家开发出一个通用的蓝牙工具类 ...
- 洛谷1052(路径压缩后简单dp)
同POJ3744写法都是一样的. 距离太长无意义可以压缩,注意不是随便压的,想一想可以跟%T发生关系. #include <cstdio> #include <cctype> ...