- Protecting Valuable Resources
- Interfaces: Action-Packed Entities
- Configuring IP Addresses
- Solution Introduction and the Flyweight Pattern
- A Generic Network Link
- A Generic Network Link Context
- A Real Network Link
- The GenericLink Implementation
- The GenericLinkContext Implementation
- The RealLink Implementation
- Bringing the Code Together
- Conclusion
- Additional Reading
A Generic Network Link Context
Listing 3 shows a context class that represents the flyweight.
Listing 3 The Flyweight class.
#define MAX_ARRAY_LENGTH 10 class GenericLinkContext { public: explicit GenericLinkContext(void); virtual ~GenericLinkContext(void); virtual int GetNextFreeSlot(); virtual void SetNextFreeSlot(int); virtual void SetAddressRange(int slot, char* baseAddress, int offset, int range); virtual char* GetBaseAddress(int slot); virtual int GetAddressOffset(int slot); virtual int GetAddressRange(int slot); private: int nextFreeSlot; struct AddressRanges { char* baseRangeAddress; int addressOffset; int addressRange; } AddressRangeArray[MAX_ARRAY_LENGTH]; };
The private array AddressRangeArray stores the details of an IP address range for a given link. The variable baseRangeAddress holds the first address in the range; for example, 10.81.1.x. The variable addressOffset holds the first number in the required range; for example, if this number is 0, it replaces the x in 10.81.1.x to make it 10.81.1.0. Next, the addressRange variable determines the last IP address in the range. If addressRange = 8, for instance, the full address range is as follows:
10.81.1.0 - 10.81.1.7
In other words, eight IP addresses (10.81.1.0, 10.81.1.1, 10.81.1.2, 10.81.1.3, and so on).
Each entry in the array AddressRangeArray stores the IP address range details for a given link. Each link has an associated slot in this array. So when I want to create a new link with an IP address range, I just get the value of nextFreeSlot by invoking GetNextFreeSlot(). If the value is less than the maximum (10), I’ll be allocating a new address range array slot. Once I have a new slot, I can then supply the IP address range by using the method SetAddressRange().
To see this technique in action, I need a concrete link type.