1. 程式人生 > >設計模式之享元模式(2)

設計模式之享元模式(2)

本質

分離與共享。

程式碼示例

(1)定義描述授權資料的享元介面

package flyWeight;
public interface FlyWeight {
        public boolean match(String privelage,String securEntity);
}

(2)實現享元物件

package flyWeight;
//封裝授權資料中重複出現的享元物件
public class ConcretFlyWeight implements FlyWeight {
    //內部狀態,許可權
    private String privelage;
    //內部狀態,安全實體
private String securEntity; //傳入狀態資料,安全實體+","+許可權 public ConcretFlyWeight(String key) { String[] ss = key.split(","); this.privelage = ss[1]; this.securEntity = ss[0]; } public String getPrivelage() { return privelage; } public String getSecurEntity
() { return securEntity; } @Override public boolean match(String privelage, String securEntity) { // TODO 自動生成的方法存根 if (this.privelage.equals(privelage) && this.securEntity.equals(securEntity)) { return true; } return false
; } }

(3)提供享元工廠來負責享元物件的共享管理和對外提供享元物件的介面。

package flyWeight;

import java.util.HashMap;
import java.util.Map;

public class FlyWeightFactory {
    private  static FlyWeightFactory fwf = new FlyWeightFactory();
    private FlyWeightFactory()
    {

    }
    public  static FlyWeightFactory getInstance()
    {
        return fwf;
    }
    //快取多個FlyWeight物件
    private Map<String,FlyWeight> hm = new HashMap<>();
    public FlyWeight getFlyWeight(String key)
    {
        FlyWeight fw = hm.get(key);
        if (hm.get(key) == null)
        {
                fw = new ConcretFlyWeight(key);
                hm.put(key, fw););//這句話第一次忘寫了,導致與上篇部落格相同的結果

        }
        return fw;
    }

}

(4)使用享元物件

package flyWeight;
import java.util.HashMap;
import java.util.Map;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;

public class SecurityMsg {
//享元物件實現成單例。
    private static SecurityMsg sm = new SecurityMsg();
    private SecurityMsg()
    {

    }
    public static SecurityMsg getIntance()
    {
        return sm;
    }
    private Map<String,Collection<FlyWeight>> hMap = new HashMap<>();
    public void login(String user)
    {
        Collection<FlyWeight> cll = queryByUser(user);
        hMap.put(user,cll   }

    public boolean hasPermit(String user,String securEntity,String privilage)
    {
        Collection<FlyWeight> cll = hMap.get(user);
        if (cll == null || cll.size() == 0)
        {
            System.out.println("沒有設定"+user+"訪問許可權");
            return false;
        }
        for (FlyWeight fl:cll)
        {
            System.out.println("fl="+fl);
            if (fl.match(privilage, securEntity))
            {
                return true;
            }
        }
        return false;
    }
    //從資料庫中獲取某人所擁有的許可權
    public Collection<FlyWeight> queryByUser(String user)
    {
        Collection<FlyWeight> cl = new ArrayList<>();
        //FlyWeight fw = null;
        for (String ss:DataBuffer.cll)
        {
            String[] str = ss.split(",");
            if (str[0].equals(user))
            {
                String key = (str[1]+","+str[2]);
                 FlyWeight fw = FlyWeightFactory.getInstance().getFlyWeight(key);//這裡使用的是享元工廠建立享受元物件
                 cl.add(fw);
            }

        }
        return cl;

    }


}

(5)客戶端

package flyWeight;

public class Client {
    public static void main(String[] args)
    {
        SecurityMsg scm = SecurityMsg.getIntance();
        scm.login("張三");
        scm.login("李四");
        boolean f1 = scm.hasPermit("張三", "薪資資料", "檢視");
        //scm.login("李四");
        boolean f2 = scm.hasPermit("李四", "薪資資料", "檢視");
        System.out.println("f1="+f1);
        System.out.println("f2="+f2);
        for (int i = 0;i < 3;i++)
        {
            scm.login("張三"+i);
            scm.hasPermit("張三"+i, "薪資資料", "檢視");
        }
    }

}

執行結果:
[email protected]
[email protected]
[email protected]
f1=false
f2=true
[email protected]
[email protected]
[email protected]
很明顯,只由2個物件了。

相關推薦

設計模式模式2

本質 分離與共享。 程式碼示例 (1)定義描述授權資料的享元介面 package flyWeight; public interface FlyWeight { public b

Head First設計模式模式蠅量模式

logs sign face isp ria reat 定義 ogr sans 一、定義 享元模式(Flyweight Pattern)主要用於減少創建對象的數量,以減少內存占用和提高性能。這種類型的設計模式屬於結構型模式,它提供了減少對象數量從而改善應用所需的對象結構的

設計模式---對象性能模式模式Flyweight

ret 大量 根據 利用 問題 字母 只讀 時代 帶來 一:概念 通過與其他類似對象共享數據來減少內存占用 如果一個應用程序使用了太多的對象, 就會造成很大的存儲開銷。 特別是對於大量輕量級 (細粒度)的對象,比如在文檔編輯器的設計過程中,我們如果為每個字母

設計模式模式蠅量模式

設計模式之享元模式(蠅量模式) 1. 什麼是享元模式 Flyweight模式也叫享元模式,是構造型模式之一,它通過與其他類似物件共享資料來減小記憶體佔用。 換句話說就是通過共享的方式高效地支援大量細粒度的物件。 享元模式的結構: 享元模式的角色和職責:

設計模式模式Flyweight

設計模式之享元模式(Flyweight) 本篇為https://github.com/iluwatar/java-design-patterns/tree/master/flyweight閱讀筆記 場景 煉金術士的商店裡擺滿了魔法藥水。許多藥水是相同的,因此不需要為每

設計模式模式Flyweight Pattern

目的:主要用於減少建立物件的數量,以減少記憶體佔用和提高效能。 應用例項: 1、JAVA 中的 String,如果有則返回,如果沒有則建立一個字串儲存在字串快取池裡面。 2、資料庫的資料池。 程式碼: 畫圖形的 介面,描述畫這個動作: public interface Shape {

設計模式模式C++

設計模式之享元模式 享元模式,運用共享技術有效地支援大量細粒度的物件。面向物件技術可以很好地解決一些靈活性或擴充套件性問題,但在很多情況下需要在系統中增加類和物件的個數。當物件數量太多時,將導致執行代價過高,帶來效能下降等問題。享元模式正式為了解決這依賴問題而誕

設計模式模式卷十一

通過使用池的技術,有效減少了大量細粒度的物件的重複生成。 0x00 組織結構 Flyweight:抽象享元類,聲明瞭可以想外界提供內部狀態的方法,同時還可以設定外部狀態。 ConcreteFlyweight:具體享元類,通常和單例模式組合使用。 U

23種設計模式模式結構型,7 Flyweight,c++實現

程式碼實現:#include<iostream>#include<list>#include<string>#include<map>usingnamespace std;classPerson{public:Person(st

java設計模式模式

並不是 計算 lov 這一 返回 實例 map() 角色 ron 當前咱們國家正在大力倡導構建和諧社會,其中一個很重要的組成部分就是建設資源節約型社會,“浪費可恥,節儉光榮”。在軟件系統中,有時候也會存在資源浪費的情況,例如在計算機內存中存儲了多個完全相同或者非常相似的

Java設計模式模式實例詳解

AI ava flyweight lan trac home erro lin 代碼 本文實例講述了Java設計模式之享元模式。分享給大家供大家參考,具體如下: 解釋一下概念:也就是說在一個系統中如果有多個相同的對象,那麽只共享一份就可以了,不必每個都去實例化一個對象。比如

設計模式的藝術 結構性模式模式

前言 知道圍棋的都知道圍棋有兩種顏色的棋子,黑色和白色,不同的地方就在於他們所放置的位置不同,大體是一樣的,所以廠家生產的時候也就是批量的進行生產,反正棋子放哪他們並不需要操心,在計算機中也會存在著很多相似的物件,如果相同的物件太多將導致系統執行代價過高,記憶體屬於計算機稀缺資源,不能隨便浪費,

設計模式 模式

info 如果能 實例化 應用 技術 一個 對象存儲 數量 col (一) 享元模式   享元模式 : 運用共享技術有效地支持大量細粒度的對象    (二)內部狀態和外部狀態   在享元對象內部並且不會隨環境改變而改變的共享部分,可以稱為是享元對象的內部狀態,而隨環

設計模式模式

享元模式定義 享元模式(Flyweight Pattern)是池技術的重要實現方式,使用共享物件可有效地支援大量的細粒度的物件。 通用類圖 具體實現 當應用程式中存在大量的物件時,程式的效能會有所下降,而且可能會造成記憶體溢位。這時除了增加硬體資源或者借用

每天一個設計模式模式

作者按:《每天一個設計模式》旨在初步領會設計模式的精髓,目前採用javascript和python兩種語言實現。誠然,每種設計模式都有多種實現方式,但此小冊只記錄最直截了當的實現方式 :) 個人技術部落格-godbmw.com 歡迎來玩! 每週至少 1 篇原創技術分享,還有開源教程(webpack

23種設計模式模式

享元模式的定義 定義: 使用共享物件可有效的支援大量的細粒度的物件 通俗的說, 就是將類的通用屬性抽出來,建立物件池,以達到限制物件數量的效果 上面定義中要求細粒度物件, 那麼不可避免的使得物件數量多且性質相近, 我們將這些物件的資訊分為兩個部分: 內部狀態和外部狀態 內部狀態是物件可以共享出來

設計模式模式(結構型)

程序 aid 共享 對象 ron map 內部 系統 抽象 模式定義 享元模式(Flyweight Pattern)就是通過共享技術實現大量細粒度對象的復用。享元模式是通過細粒度對象的共享,所以也可以說享元模式是一種輕量級模式。按照Gof模式分類,享元模式屬於對象結構型模式

C#--設計模式模式

這幾天專案比較忙,感覺已經隔了半個世紀沒來園裡轉了,接著上次的設計模式來繼續說吧,這會來敘說一下享元模式,首先應用場景:就是在  我們需要重複使用某個物件的時候,如果我們重複地使用new建立這個物件的話,這樣我們在記憶體就需要多次地去申請記憶體空間了,這樣可能會出現記憶

c#設計模式模式

//類似單例模式加上工廠模式,避免大量建立物件帶來的記憶體消耗 using System; using System.Collections; public abstract class cha

java設計模式模式Flyweight

package com.javapatterns.flyweight.simple; public class Client { private static FlyweightFactory factory; static public void main(String[] args) { fact