(一) 策略模式(Strategy)

对不用算法封装,为所有算法提供抽象接口,并通过继承该抽象算法接口对所有算法加以封装实现,具体算法选择交由客户端决定,即决策过程由客户端决定。

//策略接口  Strategy

(一) 策略模式(Strategy)
对不用算法封装,为所有算法提供抽象接口,并通过继承该抽象算法接口对所有算法加以封装实现,具体算法选择交由客户端决定。
//策略接口  Strategy
public interface Strategy {
    public double cost(double num) ;
}
//策略算法 相当于工厂
public class Context {
	private Strategy strategy;
	public Context(Strategy s) {
		this.strategy = s;
	}
	public double cost(double num) {
	return	this.strategy.cost(num);
	}
}
//打八折策略
public class StrategyA implements Strategy{
	public double cost(double num) {	
		 return num*0.8;
	}	
}
//满两百减50策略
public class StrategyB implements Strategy{
	public double cost(double num) {
		if (num>=200) {
			return num-50;
		}
		 return num;
	}	
}
public class Test {  //测试方法
  public static void main(String[] args) {
	  double num=200;
	  Context context=new Context(new StrategyA());
	  double newNum=context.cost(num);
	  System.out.println("实际付款"+newNum);  //实际付款160.0
	  Context context2=new Context(new StrategyB());
	  double newNum2=context2.cost(num);
	  System.out.println("实际付款"+newNum2); //实际付款150.0
  }
}

(三) 观察者模式

    观察者观察到被观察者的改变

public class Article {   //博客实体
	private String articleTitle;
	private String articleContent;
	public String getArticleTitle() {
		return articleTitle;
	}
	public void setArticleTitle(String articleTitle) {
		this.articleTitle = articleTitle;
	}
	public String getArticleContent() {
		return articleContent;
	}
	public void setArticleContent(String articleContent) {
		this.articleContent = articleContent;
	}

//省略get set方法  }
//具体被观察者 博主
public class BlogUser extends Observable {
	public void publihBlog(String articleTitle, String articleContent) {
		Article article = new Article();
		article.setArticleTitle(articleTitle);
		article.setArticleContent(articleContent);
		System.out.println("博主:发表新文章了!!文章标题:" + articleTitle + "  " + "文章内容:" + articleContent);
		this.setChanged(); // 手动表示已经改变
		this.notifyObservers(article);   //通知观察者   带上文章对象
	}
}
// 具体观察者
public class MyObserver implements Observer{
	public void update(Observable o, Object arg) {
		    System.out.println("------------");
		    Article art =(Article)arg;  //强制转换
          System.out.println("观察者收到的通知:"+"博主发表新博客了,快去看看!");
	       	}
}
public class Test {   //测试方法
         public static void main(String[] args) {
        	    BlogUser blogUser=new BlogUser();  //被观察者
blogUser.addObserver(new MyObserver());  //添加观察者	
			blogUser.publihBlog("AOP详解", "这是满满地的干货");
		}
}

运行结果:

博主:发表新文章了!!文章标题:AOP详解  文章内容:这是满满地的干货

观察者收到的通知:博主发表新博客了,快去看看!

博客标题:AOP详解  博客内容:这是满满地的干货

 

装饰者模式  (在Java的IO中运用到了此模式)

      用于解决扩展过多,可以动态将责任加到对象上,比生成子类更加灵活。比如豆浆有N多种,导致类爆炸。包括Component(被装饰者基类),ConcreteComponent(具体被装饰对象),Decorator(装饰者抽象基类),ConcreteDecorator(具体装饰者)。

运行结果:

实际付款160.0

实际付款150.0

//被装饰的接口(基类)
public interface Drink {
    float cost();        //计算价格
    String description();//描述
}
//具体的被装饰类   豆浆
public class SoyaBeanMilk implements Drink{
	public float cost() {// 相当于纯豆浆
		return 10f;
	}
	public String description() {
		return "纯豆浆";
	}
}
//装饰者的基类 来修饰饮品
public abstract class Decorator implements Drink {
	public Drink drink; // 要装饰的对象
	public Decorator(Drink d) {
		this.drink = d;
	}
	public float cost() {		
		return drink.cost();
	}
	public String description() {		
		return drink.description();
	}
}
//具体的装饰者类  加糖的
public class SugarDecorator extends Decorator {
	public SugarDecorator(Drink d) {
		super(d);
	}
	public float cost() {
		return super.cost()+1.0f;  //加糖之后 加1元的糖钱
	}
	public String description() {
		return super.description()+"+糖";
	}
}
//具体的装饰者类  加鸡蛋的
public class EggDecorator extends Decorator {
	public EggDecorator(Drink d) {
		super(d);
	}
	public float cost() {
		return super.cost()+3.0f;  //加鸡蛋之后 加3元的鸡蛋钱
	}
	public String description() {
		return super.description()+"+鸡蛋";
	}
}
public class Test {//测试方法
     public static void main(String[] args) {
		Drink drink=new SoyaBeanMilk();  //饮料要的是豆浆
		SugarDecorator sugar=new SugarDecorator(drink);  //加糖  1
		EggDecorator egg=new EggDecorator(sugar);     //在加糖的基础上加鸡蛋 3
		System.out.println("你点的豆浆是:"+egg.description());//纯豆浆+糖+鸡蛋
		System.out.println("一共花费:"+egg.cost()+"元");  //14元
     }
}