工厂设计模式
package com.example.demo.javadata;
public abstract class Operation {
private double numberA = 0;
private double getNumberB = 0;
public double getNumberA() {
return numberA;
}
public void setNumberA(double numberA) {
this.numberA = numberA;
}
public double getGetNumberB() {
return getNumberB;
}
public void setGetNumberB(double getNumberB) {
this.getNumberB = getNumberB;
}
public abstract double getResult();
}
class OperationAdd extends Operation{
@Override
public double getResult() {
double result = 0;
result = super.getNumberA() + super.getGetNumberB();
return result;
}
}
class OperationSub extends Operation{
@Override
public double getResult() {
double result = 0;
result = super.getNumberA() - super.getGetNumberB();
return result;
}
}
class OperationMul extends Operation{
@Override
public double getResult() {
double result = 0;
result = super.getNumberA() * super.getGetNumberB();
return result;
}
}
class OperationDiv extends Operation{
@Override
public double getResult() {
double result = 0;
if(super.getGetNumberB() == 0){
throw new ArithmeticException("除数不能为0");
}
result = (super.getNumberA() / super.getGetNumberB());
return result;
}
}
class OperationFactory {
public static Operation createOperate(String operate) {
Operation oper = null;
switch (operate) {
case "+":
oper = new OperationAdd();
break;
case "-":
oper = new OperationSub();
break;
case "*":
oper = new OperationMul();
break;
case "/":
oper = new OperationDiv();
break;
}
return oper;
}
}
class Demo1{
public static void main(String[] args) {
Operation oper;
oper = OperationFactory.createOperate("*");
oper.setNumberA(10);
oper.setGetNumberB(7);
double result = oper.getResult();
System.out.println(result);
}
}
单例设计模式
package com.example.demo.javadata;
/**
* 单例模式 类只能有一个实例
* 类的特点 1 私有构造器 2 内部构造实例对象
* 3 对外提供获取唯一实例的public方法
* 常见的单例模式有五种形式
* 1 饿汉式 2 懒汉式 3 双重检查锁式 4 静态内部类式 5 枚举式
*
*/
/**
* 饿汉式单例特点:线程安全,不能延时加载,效率较高
*/
public class SingletonDemoE {
//内部构建唯一实例
//static是属于类的 所以每次的变化引起类的变化 无论怎么实例化 都是唯一的
private static SingletonDemoE instance = new SingletonDemoE();
//私有化构造器
private SingletonDemoE(){
}
//公共静态方法 获取唯一实例对象
//这个必须是静态方法 不是静态方法会报错的
public static SingletonDemoE getInstance() {
return instance;
}
}
/**
* 懒汉单例特点:线程安全(须synchronized做方法同步),可以延时加载,效率较低.
*/
class SingletonDemoL {
//声明实例对象
private static SingletonDemoL instance;
//私有化构造器
private SingletonDemoL(){
}
//公共静态方法获取唯一实例化对象,方法同步
public static synchronized SingletonDemoL getInstance(){
if(instance == null){
instance = new SingletonDemoL();
}
return instance;
}
}
/**
* 静态内部类模式
*/
class SingletonDemoJ {
//静态内部类
private static class SingletonClassInstance {
private static final SingletonDemoJ instance = new SingletonDemoJ();
}
//私有化构造器
private SingletonDemoJ(){
}
public static synchronized SingletonDemoJ getInstance(){
return SingletonClassInstance.instance;
}
}
/**
* 枚举式 枚举式单例特点: 枚举是天然的单例,线程安全,不可延时加载,效率较高
*/
enum SingletonDemoM{
INSTANCE;
public void singletonOperation(){
}
}
观察者设计模式
package com.example.demo.javadata;
import java.util.ArrayList;
/**
* 主题
*/
public interface Subject {
//观察者注册
public void registerObserver(Observer o);
//删除观察者
public void removeObserver(Observer o);
//当主题有内容更新时调用,用于通知观察者
public void notifyObserver();
}
/**
* 观察者
*/
interface Observer{
//当气象站观测的天气发生变化时,主题会把参数传给观察者
public void update(float temp);
}
/**
* 用于布告板显示
*/
interface DisplayElement{
//在显示布告板显示的操作
public void display();
}
/**
* 接下来是实现主题发布气象信息(气温)
*/
class WeatherStation implements Subject{
private ArrayList observers;
private float temp;
public WeatherStation(){
//加个ArrayList存放所有的注册的Observer对象
observers = new ArrayList();
}
@Override
public void registerObserver(Observer o) {
//当新的观察者注册时添加进来
observers.add(o);
}
@Override
public void removeObserver(Observer o) {
//当观察者取消注册时去除该观察者
int i = observers.indexOf(o);
if(i>0){
observers.remove(i);
}
}
@Override
public void notifyObserver() {
//更新状态,调用Observer的update告诉观察者有新的消息
for(int i = 0;i < observers.size();i++){
Observer observer = (Observer) observers.get(i);
observer.update(temp);
}
}
/**
* 此方法用于气象站收到的数据,并且调用更新使数据实时通知给观察者
*/
public void setMeasurements(float temp){
this.temp = temp;
System.out.println("气象站的温度为:" + temp + "摄氏度");
notifyObserver();
}
}
/**
* 布告板上的状态显示
*/
class ConditionDisplay implements Observer,DisplayElement{
private float temp;
private Subject weatherStation;
public ConditionDisplay(Subject weatherStation){
//构造时需要注册一下观察者
this.weatherStation = weatherStation;
weatherStation.registerObserver(this);
}
@Override
public void display() {
//将数据显示在布告板上
System.out.println("布告板显示当前温度为:" + temp +"摄氏度");
}
@Override
public void update(float temp) {
this.temp = temp;
display();
}
}
/**
* 天气观测站
*/
class WeatherObserver {
public static void main(String[] args) {
//首先创建一个主题
WeatherStation weatherStation = new WeatherStation();
//创建观察者并将被观察者对象传入
ConditionDisplay conditionDisplay = new ConditionDisplay(weatherStation);
//设置气象站模拟收到的气温数据
weatherStation.setMeasurements(25);
weatherStation.setMeasurements(24);
weatherStation.setMeasurements(23);
}
}